在ROOT(CERN语言)的C ++中,我已经声明了一个2D直方图数组:
TH1F *hist[xlen][ylen];
其中xlen
和ylen
不是可变长度的;我在代码中为它们分配值。
我想将这个2D数组传递给一个函数。但是,我在指定输入参数时遇到了问题。有人可以帮助我吗?
举个例子,我可以通过一个函数来传递一维直方图(TH1F *hist[length];
),
void func(TH1F** Hist) {
cout<<Hist[0]<<endl;
}
请注意,尽管我的2D直方图具有明确的大小(即xlen
,ylen
),但在我的代码中定义,我不希望该函数仅限于单个大小的数组
答案 0 :(得分:0)
如果你想在同一个程序中对不同的维度使用相同的函数,我看到的唯一方法是将指针与维度一起传递给数组的第一个元素,然后自己计算每个索引,即current_row_index * column_size + current_column_index
:
void func(int rows, int columns, int **hist) {
static int arr[10] = {0,1,2,3,4,5,6,7,8,9};
for(int r=0; r<rows; r++) {
for(int c=0; c<columns; c++) {
int* aPtr = &arr[(r*columns+c)%10];
hist[r*columns + c] = aPtr;
cout << *hist[r*columns + c] << " ";
}
cout << endl;
}
}
int main() {
int *a20x10[20][10] = {};
int *a5x3[5][3] = {};
func(20,10,&a20x10[0][0]);
func(5,3,&a5x3[0][0]);
return 0;
}
答案 1 :(得分:0)
/*But first of all you want to pass by reference, so a
* more correct function call might be:
*/
void Call(TH1F **Hist, size_t size_x, size_t size_y);
/* allows changing hist or setting to NULL
* in function
*/
void Call2(TH1F ***Hist, size_t size_x, size_t size_y);
/* with a call like */
int main(void)
{
TH1F *hist[xlen][ylen] = NULL;
/* malloc here/memset hist */
Call(*hist, xlen, ylen);
Call2(hist, xlen, ylen);
return (0);
}
答案 2 :(得分:0)
您可以使用模板功能执行此操作。模板将自动获取数组的尺寸。
template<int C, int R>
void func(TH1F* (&hist)[C][R])
{
cout << hist[0][0] << endl;
}
答案 3 :(得分:0)
我设法通过绕过这个问题让它变得琐碎:使用向量矢量而不是2D数组。
斯蒂芬的回答似乎最接近按预期解决,但没有奏效。对我来说,知道如何调整代码以使其工作也有点太复杂了。