将2D直方图数组传递给函数(C ++)?

时间:2017-08-17 15:02:15

标签: c++

在ROOT(CERN语言)的C ++中,我已经声明了一个2D直方图数组:

TH1F *hist[xlen][ylen];

其中xlenylen不是可变长度的;我在代码中为它们分配值。

我想将这个2D数组传递给一个函数。但是,我在指定输入参数时遇到了问题。有人可以帮助我吗?

举个例子,我可以通过一个函数来传递一维直方图(TH1F *hist[length];),

void func(TH1F** Hist) {
  cout<<Hist[0]<<endl;
}

请注意,尽管我的2D直方图具有明确的大小(即xlenylen),但在我的代码中定义,我不希望该函数仅限于单个大小的数组

4 个答案:

答案 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数组。

斯蒂芬的回答似乎最接近按预期解决,但没有奏效。对我来说,知道如何调整代码以使其工作也有点太复杂了。