我试图通过一个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种传递数组的方法:
- 使用数组符号。
- 使用
std::vector<std::vector<std::vector<int>>>
- 指向第一个位置的指针。
你的代码正在使用上面的方法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***。