0

Objective-C で C API を使用しています。この API は、いくつかの特定の構造を使用する必要があります。構造体の配列を操作する方法を理解しようとすると、いくつかの問題があります。

いくつかのコードを使用して、さらに何かを示します。

Spritestruct を定義するクラスがありますVertex。Sprite のすべてのインスタンスには、独自の Vertices 配列があります。

#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 クラスを次のように使用します。Vertex 配列を作成し、この構造体を Sprite の 1 つのインスタンスに割り当てます。

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実行sizeOfするspr.verticesと が取得されます4。どうして???つまり、これは同じ値を持つ同じ構造体です。

私の疑問は、私が array[] と pointer* を間違った方法で扱っていることです...

Sprite クラスを変更して、構造体の配列を正しい方法で使用するにはどうすればよいですか?

4

2 に答える 2

2

sizeofコンパイル時に引数のサイズを計算します。ポインターを渡すと、ポインター型のサイズ (通常は 4 または 8 バイト) が返されます。逆参照されたポインターを渡した場合でも、つまり、特定のインスタンスではなくsizeof(*spr.vertices)、型のサイズを取得します。Vertex

実行時にインスタンスのサイズを知る必要がある場合は、それ (サイズ) を別の ivar に入れます。

于 2013-04-17T20:16:29.680 に答える
2

spr.verticesポインタです。これvertices2は Vertex オブジェクトの実際の配列です。それらは異なるデータ型です。

于 2013-04-17T19:55:17.283 に答える