0

私は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;
}
4

3 に答える 3

0

手動で値を割り当てる必要があります。使用している表記は、自動変数専用です。見た目は良くありませんが、動的データを初期化する唯一の方法です。そのようです:

vertices[1].Position[0] = 1;
vertices[1].Position[1] = 2;
vertices[1].Position[3] = 3;
vertices[1].Color[0] = 1;
vertices[1].Color[1] = 1;
vertices[1].Color[2] = 1;
vertices[1].Color[3] = 1;

以下同様に、頂点[2]、頂点[3]のそれぞれについて。

ああ、あなたはしなければならない

vertices[1] = malloc(sizeof(*vertices[1]));

最初にデータ用のストレージを割り当てます。

于 2012-05-11T21:54:32.607 に答える
0

これが私が提案するものです(4ではなく変数を使用しましたが)。私があなたが何をしたいのか理解していると仮定します。

Vertex *getLineSegments(int size) {
    Vertex *vertices = malloc(sizeof(Vertex) * size);
    for (int i = 0; i < size; ++i) {
        vertices[i].Position[0] = ...;
        vertices[i].Position[1] = ...;
        vertices[i].Position[2] = ...;
        vertices[i].Color[0] = ...;
        vertices[i].Color[1] = ...;
        vertices[i].Color[2] = ...;
        vertices[i].Color[3] = ...;
    }
}

そして、このメソッドを呼び出す方法:

Vertex *vertices = getLineSegments(4);

- また -

Vertex vertices[] = getLineSegments(4);
于 2012-05-11T22:50:48.747 に答える
0

タイプの1次元配列を作成しようとしていることを正しく理解している場合Vertex、これは正しいですか?

この場合、次のgetLineSegmentsようになります。

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

typedef Vertex * VertextPtr;

VertextPtr getLineSegments() 
{
    VertextPtr vertices = (VertextPtr)calloc(sizeof(Vertex), 4);

    for (int i = 0; i < 4; i++) 
    {
        vertices[i].Position[0] = 0.5;
        vertices[i].Position[1] = -0.5;
        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;
}

int main(void)
{
    VertextPtr vertices = getLineSegments();

    printf("Position: %f\n", vertices[2].Position[0]);
    printf("Position: %f\n", vertices[2].Position[1]);
    printf("Position: %f\n", vertices[2].Position[2]);
    //
    // Do clean-up here.
    return 0;   
}

コードを少しすっきりさせるためtypedefに、を使用したことに注意してください。Vertex *これがお役に立てば幸いです。

于 2012-05-12T03:10:24.930 に答える