我使用位字段的结构来访问像素中的每个颜色通道,问题是,我经常有代码以相同的方式应用于每个通道,但是由于我不能在C中迭代结构的成员,我最终为每个成员拥有相同代码的3个副本,或者更不方便地使用switch case语句。
我想如果我可以使用一个宏,这样我就可以通过提供一个数字来访问一个成员,理想情况下是一个宏,它可以使.CHAN(I)变为.r,.g或.b,这取决于整数变量I是否包含0、1或2。但我不知道怎么才能制作出这样一个宏,即使这是可能的。
一个细节,但是每个成员大约是12位,而不是8位,所以我不能把它变成一个数组或与指针联合。另外,在对另一个通道执行相同操作之前,X宏不会执行我通常需要对每个通道执行的许多操作,换句话说,用于遍历每个成员的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的问题,因为他的结构上的成员是不会与数组对齐的位字段。不过,我会把答案留在这里,希望它对某些人仍然有用。
我认为aunion
是你想要的。
您可以编写如下结构
union
{
struct
{
float r;
float g;
float b;
}rgb;
float channel[3];
} color;
这样,结构将与float[3]位于内存中的同一位置,并且您可以有效地访问与结构成员或数组中的元素相同的成员。
你可能得查一下确切的语法,但你明白了。
关于c - 宏遍历结构成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15658916/