我使用位字段的结构来访问像素中的每个颜色通道,问题是,我经常有代码以相同的方式应用于每个通道,但是由于我不能在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/

10-11 23:17
查看更多