픽셀의 각 색상 채널에 액세스하기 위해 비트 필드 구조체를 사용합니다. 문제는 꽤 자주 각 채널에 동일한 방식으로 적용되는 코드가 있기 때문에 반복 할 수 없기 때문입니다. 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