如何解决数组下标错误无效类型?



我试图通过一个3D数组的功能和改变它的值。问题是,我得到一个错误:无效类型'unsigned char[int]'数组下标。main中的代码:

unsigned char image[height][width][BYTES_PER_PIXEL];
setBlankImage((unsigned char*)image, width, height);

函数代码:

void setBlankImage(unsigned char *image, int width, int height){
for(int i = 0; i < height; ++i){
for(int j = 0; j < width; ++j){
image[i][j][2] = 0;
image[i][j][1] = 0;
image[i][j][0] = 0;
}  
}
}

有什么建议吗?

至少有3种传递数组的方法:

  1. 使用数组符号。
  2. 使用std::vector<std::vector<std::vector<int>>>
  3. 指向第一个位置的指针。

你的代码正在使用上面的方法3。由于它是指向单个位置的指针,您必须使用线性代数将指针调整到适当的单元格(参见我的注释)。

最简单的方法是使用std::vector

第一个选项将适用于您的代码:

void setBlankImage(int image[][256][256]);

如果您可以自由地更改image的类型,并且它的维度在编译时是已知的,我建议这样做:

#include <array>
#include <iostream>
template <typename T, size_t Width, size_t Height, size_t Depth>
using My3DArray = std::array<std::array<std::array<T, Depth>, Height>, Width>;
template <typename T, size_t Width, size_t Height, size_t Depth>
void setBlankImage(My3DArray<T, Width, Height, Depth>& arr, T value = 0){
for(auto& slice0: arr) {
for(auto& slice1: slice0) {
for(auto& elem: slice1) {
elem = value;
}
}  
}
}
int main()
{
My3DArray<int, 4, 3, 2> arr;
arr[0][0][0] = 42;
std::cout << arr[0][0][0] << std::endl;

try {
arr.at(3).at(2).at(1) = 43; // OK
arr.at(3).at(2).at(2) = 44; // Exception
arr[3][2][2] = 45;          // Good old SEGFAULT
}
catch(const std::out_of_range& e) {
std::cout << "There's even OOB check, sweet!" << std::endl << e.what() << std::endl;
return -1;
}

return 0;
}

这里,使用类型unsigned char***声明图像:

unsigned char image[height][width][BYTES_PER_PIXEL];

在这里,您在调用函数之前将其强制转换为unsigned char*:

setBlankImage((unsigned char*)image, width, height);

您应该将参数类型更改为unsigned char***。

最新更新