[英]Passing an array into a function c++
所以我在將整個直方圖數組傳遞到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個元素的一維數組。 該代碼將在循環中的第一個直方圖中運行,但是一旦它開始第二個循環並嘗試在第二次嘗試中訪問hist [i] .GetMaximum()則將其分段。
是什么賦予了?
這將創建一個指針數組以鍵入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);
請參考以下代碼片段:
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的大小。 要將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開始。
元素應位於h_histogram[0]
和h_histogram[1]
。
很抱歉,如果這個答案完全無關緊要,但我很想發布。 這些是我在看到您的問題后所做的實驗。
#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.*/
}
希望這會刷新您的理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.