我使用位域的結構來訪問像素中的每個顏色通道,問題是我經常有代碼以相同的方式應用到每個通道,但是因爲我不能只是迭代對於CI中結構的成員最終會爲每個成員擁有3份相同的代碼,或者更不方便地使用switch-case語句。宏來遍歷結構成員
我想如果我可以使用一個宏,以便我可以通過提供一個數字訪問一個成員,理想情況下會使.CHAN(i)成爲.r,.g或.b取決於整數變量i是否包含0,1或2.除了我不知道如何製作這樣一個宏,或者即使這是可能的。
一個細節,但每個成員是像12位,而不是8所期望的,所以我不能把它變成一個數組或與指針聯合。此外,X-Macros不會這樣做,因爲在對另一個頻道執行相同操作之前,我經常需要爲每個頻道執行許多操作,換句話說,通過每個成員的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
}
爲什麼不給我們展示一些代碼,使討論更具體? – NPE 2013-03-27 12:35:46