我几乎是C ++的新手,并且一直在通过指针工作。
//Define Colormaps (for brevity they are null)
//256 rgb combinations in each colorMap
uint8_t colorMap0[256][3];
uint8_t colorMap1[256][3];
//Insert Color Maps in to a storage array via pointer
uint8_t *colorMaps[] = {*colorMap0, *colorMap1};
//Well define a current Map Index to read from colorMaps
uint8_t colorMapIndex = 0;
//We will define a pointer to the active array that we'll update in loop()
uint8_t *currentColorMap;
偶尔我们会重新分配当前的色彩图
currentColorMap = colorMaps[colorMapIndex];
和其他时间很好地从中获取值
uint32_t c = GetColorFromMap(125);
我们也需要这些功能
// Create a 24 bit color value from B,G,R
uint32_t Color(uint8_t r, uint8_t g, uint8_t b)
{
uint32_t c;
c = r;
c <<= 8;
c |= g;
c <<= 8;
c |= b;
return c;
}
uint32_t GetColorFromMap(byte indexValue)
{
uint8_t rgb = currentColorMap[indexValue];
return Color(rgb[0], rgb[1], rgb[2]);
}
问题在于如何从当前颜色映射中获取值
当前代码在'invalid types 'uint8_t {aka unsigned char}[int]' for array subscript'
中给出了3 return Color(rgb[0],...
个错误。
我已尝试过currentColorMap的指针,但得到:
invalid type argument of unary '*' (have 'uint8_t {aka unsigned char}')
我必须使用具有低记忆足迹的灵魂,因为这是一个arduino。我以前制作了一个256x3字节的数组,它正在杀死我的动态内存....但是编译了。如果它不是另一回事!
答案 0 :(得分:2)
在C / C ++中,多维数组实际上并不像一些其他语言那样是一组两个数组。相反,int arr[a][b]
与int arr[a*b]
相同,只是它会在幕后进行一些数学运算。如果你考虑一下,它从数学上就可以了。具体来说,它允许您编写int arr[x][y]
,它将执行以下操作:
int arr[x*b+y]
以这种方式思考:每个x
行彼此相继,每个行都填充y
个。因此,如果您使用x
行的长度,则可以访问该特定条目。因此,在您的示例中,rgb
等于indexValue
颜色字节,这不是一个完整的颜色。
然而,有一个问题。你有一个指针currentColorMap
,它是你当前想要使用的数组。但是当将多维数组复制到指针中时,编译器会忘记&#34;过去是什么样的。所以你必须为它做简单的工作。
uint8_t *rgb = currentColorMap + indexValue * 3;
我们在这做什么?我们只是简单地使用currentColorMap
的指针并添加三次索引。为什么三次?因为你的第二个维度是三个,或者因为每个颜色有三个字节。然后你的颜色实际上是指向真实颜色的指针。您现在可以像以前一样对待它:
return Color(rgb[0], rgb[1], rgb[2]);