我们有以下两个静态定义的字节数组......
unsigned char pixelBuffer1[32][6] = {/**/};
unsigned char pixelBuffer2[32][6] = {/**/};
我们希望将当前缓冲区存储在变量中,但我们不确定如何声明它。这就是我们想要做的......
[SOMETYPE] activePixelBuffer;
activeBufferId == getOneOrTwoBasedOnSomeLogic();
activePixelBuffer = (activeBufferId == 1)
? pixelBuffer1
: pixelBuffer2;
activePixelBuffer[17][4] = x;
activeBufferId == getOneOrTwoBasedOnSomeLogic();
activePixelBuffer = (activeBufferId == 1)
? pixelBuffer1
: pixelBuffer2;
activePixelBuffer[23][2] = y;
(注意我们在整个代码中重新分配activePixelBuffer的值)
但是,我们不确定要为[SOMETYPE]
我知道如果我们将pixelBuffer1或pixelBuffer2传递给函数,我们会像这样定义它......
void someFunc(unsigned char (&myArray)[32][6])
{
...
}
...但这似乎不能作为局部变量声明类型。此外,这迫使我们硬编码尺寸大小,这是好的,但不必这样做会很好。
我们也尝试过使用指针,但阵列的二维方面也让我们失望。
那么我们对该类型使用了什么?
答案 0 :(得分:7)
使用typedef
:
typedef unsigned char PixelBuffer[32][6]; // NB: SPOT principle, aka DRY!
PixelBuffer pixelBuffer1 = { ... };
PixelBuffer pixelBuffer2 = { ... };
PixelBuffer *activePixelBuffer = (activeBufferId == 1) ? &pixelBuffer1 :
&pixelBuffer2;
(*activePixelBuffer)[17][4] = x;
请注意,除了使语法更清晰之外,这也是SPOT(单点真相)原则的一个例子,又名DRY(不要重复自己) - 你的2D数组类型应该只定义曾经 - 没有复制和粘贴unsigned char foo[32][6]
!
答案 1 :(得分:1)
对数组的引用在C ++中起作用:
int activeBufferId = 1;
unsigned char pixelBuffer1[32][6] = {/**/};
unsigned char pixelBuffer2[32][6] = {/**/};
unsigned char (&activePixelBuffer)[32][6] = (activeBufferId == 1) ? pixelBuffer1 : pixelBuffer2;
activePixelBuffer[17][4] = '*';
在C中,你必须使用指针:
unsigned char (*activePixelBuffer)[32][6] = (activeBufferId == 1) ? &pixelBuffer1 : &pixelBuffer2;
(*activePixelBuffer)[17][4] = '*';
activePixelBuffer = &pixelBuffer2; // reassign the pointer to point to the other C-array.
无论如何,为了简化语法和可读性,我建议将这个数组移到struct
/ class
中,这样你就必须使用类的引用/指针。
typedef struct PixelData { unsigned char buffer[32][6] } PixelData;
PixelData pixelData1 = {/**/};
PixelData pixelData2 = {/**/};
PixelData *activePixelData = (activeBufferId == 1) ? &pixelData1 : &pixelData2;