Попытка создать список функций C - PullRequest
2 голосов
/ 24 июня 2011

Я пытался создать список общих глобальных функций C для различных классов, и хотя я делал это в прошлом, у этого есть проблемы. Вот части списка .h и .c.

CGGeometry.h

//CDPoint
//////////////////////////////////////////////////////////////////////

typedef struct CDPoint {
    CGFloat x, y, z;

} CDPoint;

// Creates a CDPoint from 3 float numbers
CDPoint CDPointMake(float x, float y, float z);



//CDLine
//////////////////////////////////////////////////////////////////////

typedef struct CDLine {
    CDPoint a, b;

} CDLine;

// Creates a CDPoint from 2 CDPoints
CDLine CDLineMake(CDPoint a, CDPoint b);



//CDVector
//////////////////////////////////////////////////////////////////////

typedef struct CDVector {
    CDPoint start, finish;
    CDPoint gradient;

} CDVector;

// Creates a CDVector from 2 CDPoints
CDVector CDVectorMake(CDPoint startPoint, CDPoint endPoint);

// Returns a point travelled to on a given vector, using a start point and a distance        scalar.
CDPoint CDVectorTrace(CDVector vecToTrace, CDPoint startPoint, float distance);


//CDExtra
//////////////////////////////////////////////////////////////////////

// This is stuff that shoudn't really be in this section, but are for convenience      purposes until it has enough functions to be standalone.

GLfloat* CDMeshColorsCreateGrey(CGFloat bValue, CGFloat vertCount);

CGFloat* CDMeshVertexesCreateRectangle(CGFloat height, CGFloat width);

CDGeometry.c

#include "CDGeometry.h"

//CDGeometry.c

/* A collection of functions and typedefs that aid 2D and 3D environment positioning and  provides methods for objects and processes.  Also includes elements relevant to collision detection. */


//CDPoint
//////////////////////////////////////////////////////////////////////

CDPoint CDPointMake(float x, float y, float z)
{
    return (CDPoint) {x, y, z};
}



//CDLine
//////////////////////////////////////////////////////////////////////

CDLine CDLineMake(CDPoint a, CDPoint b) 
{
    return (CDLine) {a, b};
}




//CDVector
//////////////////////////////////////////////////////////////////////

CDVector CDVectorMake(CDPoint startPoint, CDPoint endPoint)
{
CDPoint grad = CDPointMake(startPoint.x / endPoint.x,
                           startPoint.y / endPoint.y,
                           startPoint.z / endPoint.z);

return (CDVector) {startPoint, endPoint, grad};
}



//CDExtra
///////////////////////////////////////////////////////////////////// 

GLfloat* CDMeshColorsCreateGrey(CGFloat bValue, CGFloat vertCount) 
{
GLfloat *greyColor = (GLfloat *) malloc(vertCount * 4 * sizeof(GLfloat));

int index = 0;
for (index = 0; index < (vertCount); index++)
{
    int position = index * 4;
    greyColor[position] = bValue;
    greyColor[position + 1] = bValue;
    greyColor[position + 2] = bValue;
    greyColor[position + 3] = 1.0;
}

return greyColor;
}

CGFloat* CDMeshVertexesCreateRectangle(CGFloat height, CGFloat width) {
CGFloat *squareVertexes = (CGFloat *) malloc(8 * sizeof(CGFloat));
squareVertexes[0] = -(width / 2);
squareVertexes[1] = -(height / 2);
squareVertexes[2] = (width / 2);
squareVertexes[3] = -(height / 2);
squareVertexes[4] = (width / 2);
squareVertexes[5] = (height / 2);
squareVertexes[6] = -(width / 2);
squareVertexes[7] = (height / 2);

return squareVertexes;
}

Когда я не импортирую или какой-либо другой фреймворк, я получаю «Ошибка разбора: имя неизвестного типа» для CGFloat и GLfloat. Когда я делаю это в файле .h, я получаю ошибки Parse и Semantic, где NSString - это неизвестное имя типа внутри фреймворка, а также другие ошибки «Ожидаемый идентификатор или (»).

Мне никогда не приходилось включать этот заголовок в мои исходные списки функций C, я просмотрел другой пример кода от Apple и проверил заголовки в других классах, которые используют эти функции и typedefs, и я не могу найти проблема.

1 Ответ

6 голосов
/ 24 июня 2011

CGFloat является частью CoreGraphics Framework. Если вы хотите использовать чистый C, у вас не будет доступа к CGFloat, и вам нужно будет определить его как просто float. Если ваш класс будет использоваться только с Objective-C, вы можете сделать его файлом .m, и у вас не должно возникнуть никаких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...