struct c中的多维数组

时间:2014-03-22 00:14:07

标签: c arrays pointers multidimensional-array struct

我已经尝试了很长时间了。一切似乎都有效,但我得到了很多警告,只是想要正确编程。 问题是:我正在制作一个游戏引擎。 我在3d数组中提供图像,其中前两个索引是位置,第三个是颜色。所以一个简单的4x4图像将是:

static const uint8_t font_image[2][2][3] = 
{
    {{255,255,255},{255,255,255}},
    {{255,255,255},{255,255,255}}
};

现在每个实体结构都有一个sprite结构。我想要的只是在结构中引用3维数组。

struct Sprite {
    uint32_t sizeX;
    uint32_t sizeY;
    uint8_t * data;
};

每张图片都有自己的宽度和高度,所以我无法做到这一点

uint8_t [2][2][3] data;

我一直收到这个警告:

预期消息3' const uint8_t *'但是参数类型为' const uint8_t(*)[10] [4] [3]' C:\ Users \ Elmar \ Documents \ GitHub \ EVA-OS \ EVA-OS \ Libs \ Game \ sprite.h 28 10 EVA-OS

这是制作新精灵的功能:

Sprite * sprite_new(uint32_t width, uint32_t height, const uint8_t * image)
{
    Sprite * sprite = malloc(sizeof(Sprite));
    sprite->data = image;
    sprite->sizeX = width;
    sprite->sizeY = height;
    return sprite;
}

提前致谢! :)

2 个答案:

答案 0 :(得分:0)

从您的错误消息中,您可能会在代码中的其他位置执行此操作:

uint8_t image[10][4][3] = { ... whatever ... };

Sprite *sprite = sprite_new(10, 4, image);

问题在于编译器认为image的数据类型是const uint8_t (*)[10][4][3],而不是uint8_t *。你可以使用演员:

Sprite *sprite = sprite_new(10, 4, (uint8_t *)image);

至于如何声明Sprite结构,user2357112是正确的。真的没有简单的方法来声明可变长度数组并将它们传递给C中的函数并保留其大小信息。在这方面,C有点愚蠢。您始终需要将大小信息作为一个或多个单独的参数传递。

答案 1 :(得分:0)

sprite->data = image;
你正在为数据分配空间吗?

我认为你必须为struct Sprite分配空间,但这只会包含指针的空间。然后,您需要为regoin分配空间并让数据指向它。最后,你可以memcopy填充那个空间......

Sprite * sprite = malloc(sizeof(Sprite));
sprite -> data  = malloc( width*length*sizeof(uint8_t)   );
memcopy( ...