1

c-struct配列があり、プロパティを定義したいと思います。これが相対コードです。

struct Vertex {
    float x, y, z;
    float nx, ny, nz;
    float u, v;
};

@interface Mesh : NSObject{
    Vertex m_vertices[MaxVertices];
}
@property (nonatomic) Vertex m_vertices[MaxVertices];
@end

@implementation Mesh;
@synthesize m_vertices[MaxVertices];
@end

私は最初にこのようにエラーを付けて書きました。c-struct配列でプロパティを設定する方法、またはセッターとゲッターをカスタマイズする方法は?ヒントをいただければ幸いです。

4

4 に答える 4

2

使用する

@property (nonatomic) Vertex *m_vertices;

@synthesize m_vertices;

代わりは。このような静的配列は使用できません。malloc()は、コンストラクターで次のようなものを使用し、デストラクタでfree()を使用します。

- (id)init
{
    if ((self = [super init]))
    {
        m_vertices = malloc(sizeof(*m_vertices) * NUM_OF_VERTICES);
    }
    return self;
}

- (oneway void)dealloc
{
    free(m_vertices);
    [super dealloc];
}
于 2012-05-24T14:53:14.293 に答える
1

これは私が得ることができた限り近いものでした。

typedef struct _Vertex {
float x, y, z;
float nx, ny, nz;
float u, v;
} Vertex;

#define MaxVertices 5

@interface Mesh : NSObject{
    Vertex m_verticesX[MaxVertices];
    Vertex *m_vertices;
}
@property (nonatomic) Vertex *m_vertices;
@end

@implementation Mesh;
@synthesize m_vertices;
- (Vertex *)m_vertices
{
    if (!m_vertices)
        m_vertices = m_verticesX;
    return m_vertices;
}
@end

それが役に立てば幸い。

于 2012-05-24T14:51:00.187 に答える
1

配列をプロパティとして使用することはできません。あなたは2つのことをすることができます:

1)構造体の代わりにオブジェクトを保持するためにNSArrayまたはNSMutableArrayを使用します。

また

2)配列を構造体に配置します。

typedef struct VertexArray
{
    struct Vertex m_vertices [MaxVertices];
};

@property (nonatomic, assign) VertexArray* m_vertices;

また

3)配列をオブジェクトに配置します

@interface VertexArray
{
    struct Vertex m_vertices [MaxVertices];
}

- (struct Vertex)getVertexofIndex:(NSUInteger)index;
- (void)setVertex:(struct Vertex)vertex atIndex:(NSUInteger)index;

@end

メッシュのプロパティの場合:

@property (nonatomic, retain) VertexArray* m_vertices;

または、VertexArrayのコンテンツをメッシュ内に直接配置することもできます(つまり、メンバー変数と2つのアクセサーメソッド)。

于 2012-05-24T14:53:35.297 に答える
0

Cで(任意の型の)配列を返す場合、配列の最初のインデックスを返します。

したがって、インターフェイスで宣言された以下の変数を返したい場合。

 Vertex m_vertices[MaxVertices];

私は言うことができます...

- (Vertex *)m_vertices
{
    return m_vertices;
}

上記は言っているのと同じことです...

- (Vertex *)m_vertices
   {
       return &m_vertices[0];
   }

ただし、配列全体を返したい場合は、おそらくmemcpyディレクティブを使用するのが最善の方法です。

memcpy(<#void *#>, <#const void *#>, <#size_t#>)

ここでそれを参照してください:http ://www.cplusplus.com/reference/cstring/memcpy/

このような関数を書いてください...

- (Vertex *)m_vertices
{
   Vertex *localVertex;
   memcpy(localVertex,&m_vertices,sizeof(Vertex)* MaxVertices);
   return localVertex;
}

これにより、リテラルバイトがコピーされ、非常に高速になります。配列全体が返されます。

これを行うためのより良い方法は、おそらく同様にこのような関数を作成することです。

- (Vertex *)m_vertices_nthIndex:(int)index
{
   return(&m_vertices[index]);
}

このようにして、必要なアイテムのインデックスを取得できます。

于 2013-05-03T18:29:40.420 に答える