我已经尝试了很长时间了。一切似乎都有效,但我得到了很多警告,只是想要正确编程。 问题是:我正在制作一个游戏引擎。 我在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;
}
提前致谢! :)
答案 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( ...