我有一个对象,它有一个2d char数组作为属性。
我想创建一个能够返回指向这个二维数组的指针的访问器方法。
我已经声明了这样的2d数组:
#define PRESET_LEN 15
#define NO_PRESETS 8
char camPresets[NO_PRESETS][PRESET_LEN];
对C ++不熟悉我有点费心去试图找出方法声明。
到目前为止,我在标题中有这个:
char** getPresetsForCamera(int cam);
,这在cpp
中char** DataManager::getPresetsForCamera(int cam)
{
if(currentCam != cam)
load(cam);
return camPresets;
}
但它没有编译。我显然没有理解如何正确使用指针,至少对于2D阵列,我想我可以写'return& camPresets;'返回数组的地址,但我错了。请有人告诉我我哪里出错了。谢谢,里克。
答案 0 :(得分:2)
正确的丑陋语法是:
char (&DataManager::getPresetsForCamera())[NO_PRESETS][PRESET_LEN]
{
if (currentCam != cam)
load(cam);
return camPresets;
}
可以使用typedef
简化:
typedef char camPresetsType[NO_PRESETS][PRESET_LEN];
camPresetsType& getPresetsForCamera();
但我真的建议使用std::array
或自定义类。
答案 1 :(得分:0)
你走了:
char* DataManager::getPresetsForCamera(int cam)
{
if(currentCam != cam)
load(cam);
return camPresets[cam];
}
请注意,您还应该在使用之前检查该数组的边界。这是一个更安全的版本:
char* DataManager::getPresetsForCamera(unsigned int cam)
{
assert(cam < NO_PRESETS);
if(currentCam != cam)
load(cam);
return camPresets[cam];
}
答案 2 :(得分:0)
您可以通过将其声明为双指针并在函数中返回来为camPresets动态分配数组
查看示例
char **camPresets;
char** getPresetsForCamera(int cam);
char** getPresetsForCamera(int cam)
{
//your validation
return camPresets;
}
//Code to dynamically allocate memory
camPresets = (char**)malloc(NO_PRESETS* sizeof(char*));
// for each row allocate Cols ints
for (int row = 0; row < NO_PRESETS; row++) {
camPresets[row] = (char*)malloc(PRESET_LEN* sizeof(char));
}
答案 3 :(得分:0)
嗯,您需要认为指针和数组在语义上相似,但它们的语法不同。
通过定义2d数组:
char arr[W][H];
允许编译器计算原始数据块中元素的位置。请记住,元素[0] [0]基本上是指向已分配内存块开始的指针。例如,如果您定义了一个数组并访问过:
char arr[10][20];
char arr[5][5];
你告诉编译器“从开头移动5行和5列”,这很简单:5 * H + 5 = 5 * 20 + 5 = 105。
现在,此括号表示法是编译器的附加信息。但是如你所知,数组只是一块内存。您可能会认为具有相同的含义:
&arr[0][0] == arr; // true, arr is "char*"
这意味着指针符号不再为编译器提供数组维度的宽度,因此它不能使用索引运算符。该数组被认为是一个简单的连续数据块。
在你的情况下,你应该简单地返回一个char *。您无法从函数返回数组,但可以将其指定给指针变量。
char* newArr = fun(); // char* fun() { char* test = new char[10*20]; return test; }
为避免可能超出范围错误,请改用std :: vector。
答案 4 :(得分:0)
如果您关注使用std::vector
,请使用std::array
。
#include <array>
#define PRESET_LEN 15
#define NO_PRESETS 8
typedef std::array<char, PRESET_LEN> InnerArray;
typedef std::array<InnerArray, NO_PRESETS> Array2D;
Array2D camPresets;
Array2D getPresetsForCamera(int cam)
{
return camPresets;
}
答案 5 :(得分:0)
您有许多选项可用于返回2D数组。一种是使用锯齿状阵列,就像尝试做的那样。但是,如果你真的使用char **
作为2D数组,你应该坚持使用它作为char **
锯齿状数组,而不是像你正在做的那样使用2D数组以及为什么看到编译器错误
另一个选择,如果你坚持使用真正的2D数组(毕竟,它们比锯齿状数组更高效),只需将数组包装在结构中并返回结构,就像这样:
struct camPresetsArray
{
char values[NO_PRESETS][PRESET_LEN];
};
camPresetsArray DataManager::getPresetsForCamera(int cam)
{
...
}
另一种选择是将返回值作为函数参数传递。
typedef char camPresetsArray[NO_PRESETS][PRESET_LEN];
void DataManager::getPresetsForCamera(camPresetsArray& outp, int cam)
{
...
}
camPresetsArray x;
myDataManager.getPresetsForCamera(x, y);
答案 6 :(得分:0)
嗯,最后在阅读了这里留下的答案之后,我不想将任何库导入到我的代码中,所以我留下了一个二维数组。我最终使用了这段代码:
typedef char (*pointer_to_arrays)[PRESET_LEN];
pointer_to_arrays getPresetsForCamera(int cam);
然后在cpp
DataManager::pointer_to_arrays DataManager::getPresetsForCamera(int cam)
{
if(currentCam != cam)
load(cam);
return camPresets;
}
感谢指点:P