C指针数组与其他指针数组的元素
C pointer array with elements of other pointer array
我有 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]
}
这一切都在main函数之外,只是为了学习一些我不知道的启蒙知识。请提出一种最接近引用相同值的初始想法的方法,因为目标是创建一个 ESP32 微控制器项目。
您的代码存在问题,因为您的结构中包含数组,并且需要初始化数组。
我的建议是创建一个 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 );
}
我有 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]
}
这一切都在main函数之外,只是为了学习一些我不知道的启蒙知识。请提出一种最接近引用相同值的初始想法的方法,因为目标是创建一个 ESP32 微控制器项目。
您的代码存在问题,因为您的结构中包含数组,并且需要初始化数组。
我的建议是创建一个 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 );
}