所以我有一个问题是将整个直方图数组传递给C ++中的函数
数组声明如下
TH1F *h_Energy[2];
h_Energy[0] = new TH1F("h1", "h1", 100, 0, 100);
h_Energy[1] = new TH1F("h2", "h2", 100, 0, 100);
以下是我在该功能中尝试做的事情:
void overlayhists(TH1 *hists, int numhists) {
int ymax = 0;
for (int i=0; i<numhists; i++) {
if (hist[i].GetMaximum() > ymax) {
ymax = (hist[i].GetMaximum())*1.05;
}
}
}
我正在将函数传递给像这样的数组
overlayhists(*h_Energy, 2);
其中h_Energy是具有2个元素的1D数组。代码将在循环中运行第一个直方图,但是一旦它启动第二个循环并尝试在第二个循环中访问hist [i] .GetMaximum(),请尝试使用segfaults。
是什么给出的?
答案 0 :(得分:2)
这会创建一个指向TH1F
类型的指针数组TH1F *h_Energy[2]; //edited after OP changed
如果您想使用它,并随后将其作为参数传递 您必须先对其进行初始化,然后创建函数原型以适应:
void overlayhists(TH1F **hists, int numhists);
^^
根据您在上面显示的内容,您可以这样称呼它:(初始化后)
h_Energy[0] = new TH1F("h1", "h1", 100, 0, 100);
h_Energy[1] = new TH1F("h2", "h2", 100, 0, 100);
overlayhists(h_Energy, 2);
答案 1 :(得分:1)
请参阅此代码段:
int nArr[5] = {1,2,3,4,5};
Mul(nArr, 5);
无论何时将数组传递给函数,实际上都会将指针传递给数组的第一个元素。这是C ++和C的隐含。如果你传递正常值(非数组),它将被视为传递值。
void MUl(int* nArr, size_t nArrSize){
size_t itr = 0;
for(;itr<nArrSize; itr++)
nArr[i] = 5*nArr;// here we've coded to multiply each element with 5
}
现在让我们假设我们要将nArr(从上面的代码片段)复制到另一个数组,比如nArrB
初学者的最佳方法是使用对指针的引用。 您可以将引用传递给指向函数的指针 //所以我们有了
int nArr[5] = {1,2,3,4,5};
int *nArrB;
这里我们不知道nArrB的gonnabe大小。 要将nArr复制到nArrB,我们必须传递nArr,指向nArrB的指针地址(或对nArrB指针的引用或指向nArrB指针的指针)和数组大小。 这是实施。
CopyNArr(nArr, &nArrB, 5);
void CopyNArr(int* nArr, int* & nArrB, size_t nArrSize) {
// dymanically allocating memory size for array. Assuming 4 byte int size
nArrB = new int[nArrSize*4];
size_t itr = 0;
//Copying values
for(;itr<nArrSize; itr++)
nArrB[i] = nArr[i];
}
//复制后nArrB指向5元素数组的第一个元素。
我希望它有所帮助。写下任何进一步的澄清。
答案 2 :(得分:0)
您有一个大小为2的数组,但您只创建了一个元素。而那个索引错误的那个。数组索引从0开始。
元素应位于h_histogram[0]
和h_histogram[1]
。
答案 3 :(得分:0)
如果这个答案完全不相关,我很抱歉 我很想发布它。这是我的实验 在看到你的问题后完成了。
#include<iostream>
using namespace std;
main()
{
int e[2]={0,1};
int *p[2];
int i;
/*
Printing the array e content using one pointer
from an array of pointers. Here I am not using p[2]
at all.
*/
p[1]=e;
cout<<"Elements of e are : \n";
for(i=0;i<2;i++)
{
cout<<*(p[1]+i)<<endl;
/*
In the above line both *((*p)+i) and *(p+i)
won't serve the purpose of printing the array values.
*/
}
/*Printing the array e content using pointer to array*/
cout<<"Elements of e are : \n";
for(i=0;i<2;i++)
{
cout<<*(e+i)<<endl;
}
/*Note that pointer to array is legal but array TO pointer
(don't confuse with array OF pointers) is not.*/
}
希望这会让你理解。