ANSI C:为数组分配数组和指针

时间:2008-12-09 04:55:41

标签: c performance arrays pointers

以下是我正在尝试做的简化版本,因为我确信你不想涉及粒子系统的整套结构和函数原型。

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数组,在发射器结构中记下它,然后将其复制到粒子结构中。但我只想实际复制一次值。

4 个答案:

答案 0 :(得分: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*/
}

NO!那不是正确的方法。它衰减到一个指针 - 是的,但不是一个浮点指针!如果你传递材质[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 */
}

在此处阅读:what is `int *userMask[3][4]` pointing to?。请在此处阅读有关如何正确传递数组的信息:C++ strings: [] vs. *。我会推荐你​​一个好的C或C ++书友:)。

答案 1 :(得分:1)

关于第一个片段,您会收到该错误,因为C中的数组不可分配。您必须执行memcpy来复制数组。

关于第二个代码段,您遇到以下问题:

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

material中的成员Emitter是类型为float*的二维数组。 material中的成员Particle的类型为float。请注意,一个是指针,一个不是,这就是它们不可分配的原因。

您可以写下以下内容:

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

但是假设你已经指定了那些指向 point 的指针。或者,您可以将material中的Emitter更改为非指针。我不能告诉你你应该做些什么,因为我很难根据你给出的代码来破译你的确切意图。

答案 2 :(得分: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];
    }
}

...卫生署

答案 3 :(得分: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;

}

无论如何,我希望有所帮助。