私はiOSでいくつかのOpenGLのものを使用しようとしていますが、10年間使用していないCのもので立ち往生しています。
ベースとして使用しているサンプルコードは、structVertexを宣言しています。
typedef struct {
float Position[3];
float Color[4];
} Vertex;
次に、数学に使用する頂点のCスタイルの配列を宣言します。
Vertex Vertices[] = {
{{0.5, -0.5, 0}, {1, 1, 1, 1}},
{{0.5, 0.5, 0}, {1, 1, 1, 1}},
{{-0.5, 0.5, 0}, {1, 1, 1, 1}},
{{-0.5, -0.5, 0}, {1, 1, 1, 1}}
};
この固定配列を使用するのではなく、メソッドを呼び出して頂点の新しい配列を返す必要があります。これは、行き詰まっている場所です。私が目指しているのは次のようなものです(そしてこれは完全に間違っていることを私は知っています、それは何よりも擬似コードです):
- (Vertex (*)[])getLineSegments {
Vertex *vertices = ?? //(need [allPoints count] Vertexs)
for (int i = 0; i < [allPoints count]; i++) {
vertices[i] = { [allPoints[i] getPoints], [allPoints[i] getColor] }; //how do I make a new Vertex in this fashion?
//and then, in getPoints/getColor, how would I make a float[] and return that properly
}
return vertices;
}
mallocを使用して値をインスタンス化して割り当てようとするだけで、他の場所で読んだことが悲惨に失敗します。
- (Vertex (*)[])getLineSegments {
Vertex (*vertices)[4] = malloc(sizeof(Vertex) * 4);
Vertex *point = malloc(sizeof(Vertex));
float Pos[3] = {0.5, -0.5, 0}; //error: Array Type Pos[3] is not assingable
point->Position = Pos;
float Color[4] = {1,1,1,1};
point->Color = Color;
vertices[0] = point;
vertices[1] = {{0.5, 0.5, 0} , {1, 1, 1, 1}};
vertices[2] = {{-0.5, 0.5, 0}, {1, 1, 1, 1}};
vertices[3] = {{-0.5, -0.5, 0},{1, 1, 1, 1}}; //errors... errors everywhere
return vertices;
}
これを適切に行うにはどうすればよいですか?
---
編集:バートンのアドバイスから以下に更新。まだいくつかのエラー:
- (Vertex (*)[])getLineSegments {
Vertex (*vertices)[4] = malloc(sizeof(Vertex) * 4);
for (int i = 0; i < 4; i++) {
vertices[i] = malloc(sizeof(*vertices[i])); //err: Array type 'Vertex[4]' is not assignable
vertices[i]->Position[0] = 0.5; //this one works. is this correct?
vertices[i].Position[1] = -0.5; //Member reference type 'Vertex *' is a pointer; maybe you meant to use ->?
vertices[i].Position[2] = 0;
vertices[i].Color[0] = 1;
vertices[i].Color[1] = 1;
vertices[i].Color[2] = 1;
vertices[i].Color[3] = 1;
}
return vertices;
}