簡體   English   中英

ANSI C:分配數組和指向數組的指針

[英]ANSI C: Assigning arrays and pointers to arrays

以下是我正在嘗試做的簡化版本,因為我確定您不想遍歷整個粒子系統的結構和函數原型。

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結構中使用了“ float material [4] [4]”和createEmitter的簽名。 但是,稍后,當我嘗試使用以下方法將值復制到粒子中進行修改時:

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數組,將其記錄在發射器結構中,然后將其復制到粒子結構中。 但是我只想實際復制一次值。

我正在回答您的最新問題(出現在您自己的答案中)。 首先您的代碼:

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*/
}

沒有! 那不是正確的方法。 它衰減到一個指針-是的,但不是一個指向浮點數的指針! 如果傳遞materials [0],則將得到一個float const[4][4] ,該float const(*)[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 ++書友:)

關於第一個代碼段,您會收到該錯誤,因為C中的數組不可分配。 您必須執行一次memcpy才能復制陣列。

關於第二個片段,您對以下行有疑問:

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

Emitter的成員materialfloat*類型的二維數組。 Particle的成員materialfloat類型。 請注意,一個是指針,一個不是指針,這就是為什么它們不可分配的原因。

您可以編寫以下內容:

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

但這是假設您已將這些指針分配為指向某物。 或者,您可以將Emitter material更改為非指針。 我無法告訴您您應該確定該做什么,因為我很難根據給出的代碼來理解您的確切意圖。

當然,在我第二次尋求幫助時,我會弄清楚我需要做什么。

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];
    }
}

衛生署...

我曾經是這方面的專家。 不幸的是,我離開它已經太久了。 因此,這是我大約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;

}

無論如何,我希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM