2

以下は、私がやろうとしていることの単純化されたバージョンです。なぜなら、パーティクル システムの構造体と関数プロトタイプのセット全体をくまなく調べたくないからです。

float const materials[24][4][4] = {{{...}}};
typedef struct EmitterStruct  { float *material[4][4]; } Emitter;
typedef struct ParticleStruct { float material[4][4]; } Particle;
Emitter *myEmitter;

Emitter * createEmitter(float *material[4][4])
{
    Emitter * newEmitter;
    newEmitter = (Emitter *)malloc(sizeof(Emitter));
    newEmitter->material = materal; /* Returns "incompatable types in assignment" */
    return newEmitter;              /* I also tried newEmitter->material = &material */
}

int main(char *argv, int argc)
{
    myEmitter = createEmitter(materials[0]);
}

本質的に、コメントが示すように、コンパイル エラーが発生します。Emitter 構造体と createEmitter のシグネチャで「float material[4][4]」を使用するなど、いくつかの方法を試しました。ただし、後で次を使用して変更のために値をパーティクルにコピーしようとすると、次のようになります。

for (i=0; i++; i<4)
{
    for (j=0; j++; j<4)
    {
        particle->material[i][j] = emitter->material[i][j];
    }
}

すべてが float[4][4] 型として宣言されているにもかかわらず、コピー時に別の型の不一致が発生します。要するに、4x4 配列の配列から 4x4 配列を取得し、それをエミッタ構造体に記録してから、パーティクル構造体にコピーしたいと考えています。しかし、実際に値をコピーしたいのは一度だけです。

4

4 に答える 4

3

私はあなたの更新された質問に答えています(あなた自身の答えに現れました)。最初にあなたのコード:

float const materials[24][4][4] = {{{...}}};
typedef struct EmitterStruct  { float *material; } Emitter; /*Use just a plain pointer*/
typedef struct ParticleStruct { float material[4][4]; } Particle;
Emitter *myEmitter;

Emitter * createEmitter(float *material) /*Use a plain pointer here*/
{
    Emitter * newEmitter;
    newEmitter = (Emitter *)malloc(sizeof(Emitter));
    newEmitter->material = material; 
    return newEmitter;               
}

int main(char *argv, int argc)
{
    myEmitter = createEmitter(materials[0]);/*This decays into a pointer*/
}

いいえ!それは正しい方法ではありません。それはポインターに減衰します - はい、しかしフロートへのポインターではありません! material[0] を渡すと、 (その最初の要素へのポインター) にfloat const[4][4]減衰するが得られ、float const(*)[4]そのポインターが渡されます。したがって、これを次のように変更します。

float const materials[24][4][4] = {{{...}}};
/*Use just a plain pointer to an array */
typedef struct EmitterStruct  { float const (*material)[4]; } Emitter; 
typedef struct ParticleStruct { float material[4][4]; } Particle;
Emitter *myEmitter;

/*Use a plain pointer here. Bet keep it float const, not only float!*/
Emitter * createEmitter(float const (*material)[4])
{
    Emitter * newEmitter;
    newEmitter = (Emitter *)malloc(sizeof(Emitter));
    newEmitter->material = material; 
    return newEmitter;               
}

int main(int argc, char ** argv) /* you swapped args here */
{
    myEmitter = createEmitter(materials[0]); /* This decays into a pointer */
}

ここでそれについて読んでください: `int *userMask[3][4]` は何を指していますか? . 配列を適切に渡す方法については、こちらをお読みください: C++ 文字列: [] vs. *。良い C または C++ の本の仲間をお勧めします :)

于 2008-12-09T06:00:08.573 に答える
1

最初のスニペットに関しては、C の配列は代入できないため、そのエラーが発生します。memcpyアレイをコピーするには、a を実行する必要があります。

2 番目のスニペットに関しては、次の行に問題があります。

particle->material[i][j] = emitter->material[i][j];

のメンバmaterialEmitter、タイプ の 2 次元配列ですfloat*。のメンバーmaterialParticleタイプはfloatです。1 つはポインターで、もう 1 つはポインターではないことに注意してください。

次のように記述できます。

particle->material[i][j] = *(emitter->material[i][j]);

ただし、それは、これらのポインターが何かを指すように割り当てられていることを前提としています。または、非ポインターに変更することもできmaterialます。Emitterあなたが与えたコードに基づいてあなたの正確な意図が何であるかを解読するのは難しいので、あなたが何をすべきかを確実に伝えることはできません.

于 2008-12-09T05:05:57.277 に答える
0

私はかつてこれについての専門家でした。残念ながら、私はあまりにも長い間それから離れていました。ここに、私が約 6 年前に書いた実用的なコード スニペットを示します。それがあなたを正しい方向に向けるかもしれないと思います。

// get a color histogram of an image
int ***colorHistogram(PIXEL *inputImage, HEADER *imageHeader)
{
    int x, y, z;

    // a color histogram
    int ***histo;

    // allocate space for the histogram
    histo = (int ***)malloc(256 * sizeof(int**));
    for(x=0; x<256; x++)
    {
        histo[x]=(int **)malloc(256 * sizeof(int*));
        for(y=0; y<256; y++)
        {
            histo[x][y]=(int *)malloc(256 * sizeof(int));

            // initialize the histogram
            for(z=0; z<256; z++)
                histo[x][y][z] = 0;
        }
    }

    // fill the histogram
    for (x = 0; x < imageHeader->width * imageHeader->height; x++)
    {
        histo[((int) inputImage[x].r)][((int) inputImage[x].g)][((int) inputImage[x].b)]++;
    }

return histo;

}

とにかく、それが役立つことを願っています。

于 2008-12-09T05:12:37.420 に答える
0

もちろん、助けを求めた瞬間に、自分が何をする必要があるかを正確に把握します。

float const materials[24][4][4] = {{{...}}};
typedef struct EmitterStruct  { float *material; } Emitter; /*Use just a plain pointer*/
typedef struct ParticleStruct { float material[4][4]; } Particle;
Emitter *myEmitter;

Emitter * createEmitter(float *material) /*Use a plain pointer here*/
{
    Emitter * newEmitter;
    newEmitter = (Emitter *)malloc(sizeof(Emitter));
    newEmitter->material = material; 
    return newEmitter;               
}

int main(char *argv, int argc)
{
    myEmitter = createEmitter(materials[0]);/*This decays into a pointer*/
}

そして、コピーのために:

for (i=0; i++; i<4)
{
    for (j=0; j++; j<4)
    {
        particle->material[i][j] = *(emitter->material[i * 4 + j];
    }
}

ど…

于 2008-12-09T05:08:44.153 に答える