簡體   English   中英

將數組傳遞給函數C ++

[英]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);

1.將任何數組傳遞給c ++函數以更改內容:

請參考以下代碼片段:

//調用:

int nArr[5] = {1,2,3,4,5};

Mul(nArr, 5);

每當將數組傳遞給函數時,實際上就將指針傳遞給數組的第一個元素。 這對於C ++和C是隱式的。但是,如果您傳遞正常值(非數組),則它將被視為按值傳遞。


//函數Mul()的聲明和定義

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
}

2.將任何Ptr傳遞給c ++中的函數以更改指向的指針:

現在讓我們假設我們想將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM