我使用位字段结构来访问像素中的每个颜色 channel ,问题是我经常有以相同方式应用于每个 channel 的代码,但因为我不能只迭代结构的成员在 C 中,我最终为每个成员拥有 3 个相同代码的副本,或者更不方便的是必须使用 switch-case 语句。
我想如果我可以使用一个宏,这样我就可以通过提供一个数字来访问一个成员会更优雅,理想情况下是一个可以使 .CHAN(i) 变为 .r、.g 或 .b 的宏,具体取决于关于整数变量 i 是否包含 0、1 或 2。除了我不知道如何制作这样的宏,或者即使这是可能的。
一个细节,但每个成员大约是 12 位,而不是人们可能期望的 8 位,所以我不能只将它变成一个数组或有一个带指针的 union 。 X-Macros 也不会做,因为我经常需要在对另一个 channel 做同样的事情之前对每个 channel 做很多事情,换句话说,用于遍历每个成员的 for 循环可以包含的不仅仅是一行。
编辑:这是一些代码,首先是结构:
typedef struct
{
uint32_t b:12;
uint32_t g:12;
uint32_t r:12;
uint32_t a:12;
} lrgb_t;
现在我的问题在代码中的示例:
for (ic=0; ic<3; ic++)
{
for (i=0; i<curvecount; i++)
{
curve[i].p0.x = (double) i;
curve[i].p3.x = (double) i+1.;
switch (ic) // this is what I'm trying to eliminate
{
case 0:
curve[i].p0.y = pancol[i].r / 4095.;
curve[i].p3.y = pancol[i+1].r / 4095.;
break;
case 1:
curve[i].p0.y = pancol[i].g / 4095.;
curve[i].p3.y = pancol[i+1].g / 4095.;
break;
case 2:
curve[i].p0.y = pancol[i].b / 4095.;
curve[i].p3.y = pancol[i+1].b / 4095.;
break;
}
// Ideally this would be replaced by something like this, CHAN() being an hypothetical macro
// curve[i].p0.y = pancol[i].CHAN(ic) / 4095.;
// curve[i].p3.y = pancol[i+1].CHAN(ic) / 4095.;
}
... // more stuff that ultimately results in a bunch of pixels being written, channel after channel
}
最佳答案
正如评论中所指出的,这并没有真正解决 OP 的问题,因为他的结构中的成员是位域,不会与数组对齐。不过,我会将答案保留在这里,希望它仍然对某些人有用。
我认为 union
是您想要的。
您可以编写您的结构,例如
union
{
struct
{
float r;
float g;
float b;
}rgb;
float channel[3];
} color;
这样结构将在内存中与 float[3] 位于同一位置,并且您可以有效地访问与结构成员或数组中的元素相同的成员。
您可能需要查找确切的语法,但您明白了。
关于c - 迭代结构成员的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15658916/