从动态分配的2D阵列指针中获取一行

时间:2015-04-26 01:40:38

标签: c++ c arrays pointers

我几乎是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字节的数组,它正在杀死我的动态内存....但是编译了。如果它不是另一回事!

1 个答案:

答案 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]);