2013-04-17 2 views
0

Objective-C에서 C Api로 작업하고 있습니다. 이 API는 특정 구조를 사용해야합니다. 구조체 배열을 사용하여 작업하는 방법을 파악하는 데 문제가 있습니다. I 클래스 나 구조체 Vertex을 정의 SpritesizeOf Struct 및 sizeOf 인스턴스 변수가 다른 값을 반환합니다.

:

내가 당신에게 몇 가지 코드에 더 뭔가를 보여줍니다. Sprite의 모든 인스턴스에는 자체 Vertices 배열이 있습니다. 나는이 방법으로 Sprite 클래스를 사용하는 다른 클래스에서

#import <Foundation/Foundation.h> 

typedef struct { 
    float Position[3]; 
    float Color[4]; 
} Vertex; 

@interface Sprite : NSObject{ 
    Vertex *_vertices; 
} 

//Getter setter methods 
-(void)setVertices:(Vertex*)vx; 
-(Vertex*)vertices; 
@end 

: 나는 정점 배열을 생성하고 난 스프라이트의 인스턴스에이 구조체를 할당 : 이제

Sprite *spr = [[Sprite alloc]init]; 

Vertex vertices2[] = { 
    {{1, -1, 0}, {1, 0, 0, 1}}, 
    {{1, 1, 0}, {1, 0, 0, 1}}, 
    {{-1, 1, 0}, {1, 1, 0, 1}}, 
    {{-1, -1, 0}, {1, 1, 0, 1}} 
}; 

spr.vertices = vertices2; 

내가 직접에 sizeOf을 수행하는 경우 vertices2 구조체 내가 112 값을 얻고 spr.verticessizeOf을 수행하면 4이 나옵니다. 왜??? 이것은 동일한 값을 가진 동일한 구조체를 의미합니다.

내 의심의 여지가 내가 어떻게 올바른 방법 구조체의 배열을 사용하는 Sprite 클래스를 수정할 수 있습니다 ... [] 배열로 잘못된 방법으로 포인터 *로

을 일하고 있다는 것입니다?

답변

2

sizeof은 컴파일 타임에 인수의 크기를 계산합니다. 포인터를 전달하면 포인터 유형 (보통 4 또는 8 바이트)의 크기가 반환됩니다. 참조 된 포인터 (예 : sizeof(*spr.vertices))를 전달하더라도 특정 사례가 아닌 Vertex 유형의 크기가 표시됩니다.

런타임에 인스턴스의 크기를 알아야하는 경우 크기 (iterize)를 다른 ivar에 넣으십시오.

+1

'sizeof'는 항상 컴파일 타임에 계산되지는 않습니다. 예를 들어 가변 길이 배열을 사용합니다. 하지만 그 중 하나가 아닙니다. – sapi

2

spr.vertices은 포인터입니다. vertices2은 Vertex 객체의 실제 배열입니다. 이들은 서로 다른 데이터 유형입니다.

+0

좋아요, 그럼 Sprite 클래스의 인스턴스 변수로 배열을 추가 할 수 있습니까? 쓸 수 없다 '@interface Sprite : NSObject { 정점 _vertices []; }' – MatterGoal

+1

크기를 아는 경우 배열 선언에 지정할 수 있습니다. I.E. 'Vertex _vertices [4]'. 가변 길이 배열을 가지고 있다면 정점 배열에 대한 포인터와 배열의 길이를 저장하고 sizeof (Vertex) * arrayLen을 수행해야합니다. –