2011-09-25 2 views
0

안녕하세요 저는 iOS에서 프로그래밍하고 객관적인 C를 사용하여 비교적 새로운 것입니다. 최근에 해결할 수없는 문제를 보았습니다. OBJ 모델 로더를 사용하고 있습니다. iOS 프로그래밍. 이를 위해 I는 다음과 같은 두 개의 배열을 사용목표에 동적으로 길이를 할당 C 정적 배열

길이는 현재 360의 하드 코딩 된 값 (특정 모델의면의 수)에 할당 된 바와 같이
static CGFloat modelVertices[360*9]={}; 
static CGFloat modelColours[360*12]={}; 

. OBJ 파일을 읽은 후 계산 된 값에서 동적으로 할당 할 수있는 방법이 있습니까?

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

나는 NSMutable 배열을 사용하여 시도했지만 실제로 메시는이 코드 사용할 필요가 모여 그리기에 관해서으로 사용하기 어려운 발견 : 명령 glVertexPointer을 볼 수 있듯이

-(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); 
} 

을 CGFloat 배열과 값이 필요합니다

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

답변

0

정적 변수를 선언 할 때 컴파일 타임에 그 크기와 초기 값을 알아야합니다. 변수 대신 포인터를 배열로 선언하면 배열에 공간을 할당하고 변수에 결과를 저장하는 데 malloc 또는 calloc을 사용합니다. 정적 배열은 기본적으로 0으로 채워 때문에

static CGFloat *modelColours = NULL; 

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

는 여기 calloc 대신 malloc을 사용하고,이 코드가 일치 함을 확인한다.

+2

다시 말하지만, 상대방을 자유롭게 할 필요성을 언급하지 않고 malloc 또는 calloc을 초보자에게 언급해서는 안됩니다. –

+0

감사합니다,이 calloc을 사용하여, 이제 드디어 잠들 수 있습니다! 메모리를 확보하는 데 대한 @DanielRHicks, 좋은 지적, 내일 이것을하려고 노력할 것입니다! –

1

당신은 동적 배열을위한 공간을 할당하는 C 스타일의 malloc을 사용할 수 있습니다.

int numOfVertices = //whatever this is read from file; 
CGFloat *modelColours = (CGFloat *) malloc(sizeof(CGFloat) * numOfVertices); 
+1

물론 그렇게하면 적절한 시간에 배열 공간을 확보해야합니다. –

+0

고마워, 나도 이걸 시도해 봤어. 그리고 적은 텍스트 줄을 차지합니다! –