从动态分配的2D数组指针中获取行

Get An Row From Dynamically Allocated 2D Array Pointer

本文关键字:获取 指针 数组 动态分配 2D      更新时间:2023-10-16

我是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]);
}

问题在于如何从当前的颜色图中获取值

当前代码在CCD_ 2中给我3个CCD_。

我已经尝试了currentColorMap中的指针,但得到了:

invalid type argument of unary '*' (have 'uint8_t {aka unsigned char}')

我不得不用一个低记忆脚印的灵魂,因为这是一个arduino。我之前制作了一个256x3字节的数组,这会扼杀我的动态内存。。。。不管怎样编译。如果不是一回事,那就是另一回事!

在C/C++中,多维数组实际上不像其他语言中那样是两个数组的集合。相反,int arr[a][b]int arr[a*b]相同,只是它将在幕后进行一些计算。如果你仔细想想,它会从数学上产生。具体来说,它允许您编写int arr[x][y],它将执行以下操作:

int arr[x*b+y]

这样想:每个x行一个接一个,每个行都填充有ys。因此,如果你按x行的长度计算,你就可以访问该特定条目。因此,在您的示例中,rgb等于'invalid types 'uint8_t {aka unsigned char}[int]' for array subscript'0第10个颜色字节,它不是全色。

然而,存在一个问题。您有一个指针currentColorMap,它是您当前要使用的数组。但是,当将多维数组复制到指针中时,编译器会"忘记"它曾经是什么。所以,你必须为它做简单的工作。

uint8_t *rgb = currentColorMap + indexValue * 3;

我们在这里干什么?我们只需取currentColorMap指针,并将添加到索引的三倍。为什么三次?因为你的第二个维度是三,或者,因为每种颜色有三个字节。那么你的颜色实际上就是一个指向真实颜色的指针。你现在可以像以前一样对待它:

return Color(rgb[0], rgb[1], rgb[2]);