繁体   English   中英

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

[英]Pass 2D array of histograms to function (C++)?

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

TH1F *hist[xlen][ylen];

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

我想将此2D数组传递给函数。 但是,我在指定输入参数时遇到了麻烦。 有人可以帮我吗?

例如,我可以传递一维直方图( TH1F *hist[length]; ),其功能类似于

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

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

如果要在同一程序中对不同的维度使用相同的函数,那么我看到的唯一方法是将指针与维度一起传递给数组的第一个元素,然后自行计算每个索引,即按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;
}
/*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);
}

您可以使用模板功能执行此操作。 模板将自动获取数组的尺寸。

template<int C, int R>
void func(TH1F* (&hist)[C][R])
{
    cout << hist[0][0] << endl;
}

通过解决这个问题,我设法使它正常工作:使用向量的向量而不是2D数组。

史蒂芬(Stephan)的答案似乎最接近于按预期解决问题的方法,但没有用。 对于我来说,知道如何调整代码以使其工作也太复杂了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM