Динамическое выделение длины для целевого статического массива C - PullRequest
0 голосов
/ 25 сентября 2011

Привет, я относительно новичок в программировании на iOS и использую цель C. Недавно я столкнулся с проблемой, которую, похоже, не могу решить, я пишу загрузчик модели OBJ для использования в моем программировании на iOS. Для этого я использую два массива, как показано ниже:

static CGFloat modelVertices[360*9]={};
static CGFloat modelColours[360*12]={}; 

Как видно, длина в настоящее время назначается с жестко закодированным значением 360 (количество граней в конкретной модели). Нет ли способа, которым это может быть динамически выделено из значения, которое было вычислено после чтения файла OBJ, как это сделано ниже?

int numOfVertices = //whatever this is read from file;
static CGFloat modelColours[numOfVertices*12]={}; 

Я пытался использовать массивы NSMutable, но мне было трудно их использовать, поскольку, когда дело доходит до рисования собранной сетки, мне нужно использовать этот код:

-(void)render
{
// load arrays into the engine
glVertexPointer(vertexStride, GL_FLOAT, 0, vertexes);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(colorStride, GL_FLOAT, 0, colors);   
glEnableClientState(GL_COLOR_ARRAY);

//render
glDrawArrays(renderStyle, 0, vertexCount);  
}

Как видите, команда glVertexPointer требует значения в виде массива CGFloat:

glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Вы можете использовать malloc в стиле c для динамического выделения пространства для массива.

int numOfVertices = //whatever this is read from file;
CGFloat *modelColours = (CGFloat *) malloc(sizeof(CGFloat) * numOfVertices);
0 голосов
/ 25 сентября 2011

Когда вы объявляете статическую переменную, ее размер и начальное значение должны быть известны во время компиляции. Что вы можете сделать, это объявить переменную как указатель вместо массива, используйте malloc или calloc, чтобы выделить место для массива и сохранить результат в вашей переменной.

static CGFloat *modelColours = NULL;

int numOfVertices = //whatever this is read from file;
if(modelColours == NULL) {
    modelColours = (CGFloat *)calloc(sizeof(CGFloat),numOfVertices*12);
}

Я использовал calloc вместо malloc здесь, потому что статический массив будет заполнен нулями по умолчанию, и это обеспечит согласованность кода.

...