【问题标题】:C pointer array with elements of other pointer array具有其他指针数组元素的 C 指针数组
【发布时间】:2021-03-06 03:19:09
【问题描述】:

我有 2 个结构,一个用于颜色 (PixelColor),第二个用于保存可用颜色数组 (Palette)。

typedef struct{
    int r;
    int g;
    int b;
    int a;
}PixelColor;

typedef struct{
    int size;
    PixelColor *palette;
}Palette;

一个游戏的全局调色板和一个用于引用全局调色板中颜色的对象。

PixelColor ShovelKnightColors[] = {
    {0, 0, 0, 255}, 
    {44, 44, 44, 255}, 
    {96, 96, 96, 255}, 
    {200, 192, 192, 255}, 
    {0, 64, 88, 255}, 
    ...
};
Palette GamePalette = {59, ShovelKnightColors};
PixelColor CharacterColors[4];
//This doesn't work
CharacterColors[0] = GamePalette.palette[0];
CharacterColors[1] = GamePalette.palette[17];
CharacterColors[2] = GamePalette.palette[24];
CharacterColors[3] = GamePalette.palette[37];

Palette CharacterPalette = {4, CharactersColors};

我可能遗漏了一个基本的东西,但我尝试了我的任何想法。举个例子:

PixelColor CharacterColors[] = {
    GamePalette.palette[0], 
    GamePalette.palette[17], 
    GamePalette.palette[24],
    GamePalette.palette[37]
}

所有这些都超出了主要功能,只是为了学习我不知道的关于启动的东西。请提出一种最接近引用相同值的初始想法的方法,因为目标是创建一个 ESP32 微控制器项目。

【问题讨论】:

  • 为什么不:PixelColor CharacterColors[4] = {GamePalette.palette[0], GamePalette.palette[17], GamePalette.palette[24], GamePalette.palette[37]};(请注意您的示例中缺少的 4)
  • 我已经尝试过了,但出现错误:初始化元素不是常量。这是在 main() 之前

标签: arrays c pointers initialization


【解决方案1】:

您的代码的问题在于您的结构中有数组,并且需要初始化数组。

我的建议是创建一个 FillPalette() 函数,每次都会进行适当的内存分配:

void FillPalette(Palette *p, int size, PixelColor pixelColors[])
{
    p->size = size;
    p->palette = malloc( sizeof(PixelColor) * size );

    for(int i = 0; i < size; ++i)
    {
        p->palette[ i ].r = pixelColors[ i ].r; 
        p->palette[ i ].g = pixelColors[ i ].g;
        p->palette[ i ].b = pixelColors[ i ].b;
        p->palette[ i ].a = pixelColors[ i ].a;
    }
}

为了避免for 循环,另一种可能性是在数组初始化后使用memcopy

不管怎样,当不再使用时记得清除调色板:

void ClearPalette(Palette *p)
{
    p->size = 0;
    free( p->palette );
}

【讨论】:

  • 谢谢!这看起来是一个优雅的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 2017-08-25
  • 2010-10-25
相关资源
最近更新 更多