2011-06-21 28 views
3

這裏返回數組是我的代碼從功能

double hour_payload_add(int entries , double array[]) 
{ 
    int index=0 ,k=0; 
    int totalpayload=0; 
    double returnarray[entries/120]; 
    while(k< entries) 
    { 
      totalpayload = totalpayload + array[k]; 
      if(k%120==0) 
       { 
       returnarray[index] = totalpayload; 
       index++; 
       totalpayload=0; 
       } 

    } 

return returnarray; 
} 

在這裏,我把它稱爲

double hourgraph[hrentries]; 
hourgraph= hour_payload_add(entries , graph); 

因爲我想返回一個數組是我應該做的,而無需使用指針返回?

+3

這不是'C++'代碼,'double returnarray [entries/120];'是在運行時決定的(在C99中有效) – iammilind

+1

@iammilind:在這個上下文中的「代碼」是一個不可數名詞;因此,「一個C++代碼」是不正確的。只是說。 –

+0

相關:http://stackoverflow.com/questions/4174901/how-do-i-return-an-array-from-a-function –

回答

5

參照給函數傳遞陣列,並且不返回任何東西。小例子:

void hour_payload_add(int entries , double array[], double (&returnArray)[SIZE]) 
{ 
    // returnArray will be updated as it's external to function. 
} 

void hour_payload_add(int entries , double array[], double *returnArray) // <-- pointer 
{ 
    // returnArray will be updated as it's external to function. 
} 

用法:

double returnArray[SIZE]; 
hour_payload_add(entries, array, returnArray); 
+0

好吧,先生,非常感謝 – sajid

+0

先生我已經定義並以這種方式調用函數,但它給了我錯誤的條目沒有在這個範圍內定義.array沒有在這個範圍內定義和什麼編寫大小 – sajid

+0

@sajid,在C++數組需要具有固定的大小。假設,如果你覺得難以評估,那麼你也可以簡單地通過指針傳遞。看,我編輯了我的答案。 – iammilind

1

你不能在C++中返回數組 - 你寧願返回一個指向一段內存的指針。

此外,由於堆棧在函數終止後立即恢復,因此無法將指針返回到堆棧上的本地聲明數組。您必須動態分配它newmalloc,並返回一個指向其開始的指針。

+0

當然可以。 '的std :: array'。儘管這裏的矢量更合適,但考慮到容器的動態大小。 –

0

您不能從C++函數返回c樣式數組。但是,是的,你可以從一個功能

您可以返回啓動其上創建本地的函數內的C風格數組的地址返回std::array容器,但陣列將被清除,當函數返回,你只剩下一個指針指向不是你想要的。

您必須使用new動態分配一個數組,然後返回指向它的指針。

+0

'std :: array foo(){std :: array ar {0,1,2};返回ar; }' –

1

爲此,您應該使用指針並在填充它之前創建數組(而不是在填充它的函數中)。

double* hour_payload_add(int entries , double array[])

但是我寧願傳遞數組作爲參考。

void hour_payload_add(int entries , double array[], double& ret_array[])

甚至更​​好(因爲別人會說)是使用向量。

void hour_payload_add(std::vector<double>array, std::vector<double>& ret_array)

+0

先生,我應該使用第三種方法做到這一點,我用這種方式調用它hour_payload_add(entries,graph,&hourgraph);先生親切地指導我我錯在哪裏 – sajid

+0

看看@sehe答案 - 他給了你完整的功能。 –

+0

好吧,先生,謝謝很多 – sajid

1

你必須使用新創建您的陣列。所以,你的功能應該是這樣的:

double* hour_payload_add(int entries , double array[]) 
{ 
    int index=0 ,k=0; 
    int totalpayload=0; 
    double* returnarray = new double[entries/120]; 
    while(k< entries) 
    { 
      totalpayload = totalpayload + array[k]; 
      if(k%120==0) 
       { 
       returnarray[index] = totalpayload; 
       index++; 
       totalpayload=0; 
       } 

    } 

    return returnarray; 
} 

使用數組後,您必須釋放的空間通過調用delete []陣列上,以避免內存泄漏:

int entries = 5; 
double* array = hour_payload_add(entries); 
for (int i=0; i < entries; i++) 
{ 
    std::cout << array[i] << std::endl; 
} 

delete[] array; 
+2

+1提到'刪除[]'的重要性,甚至是'我認爲使用'矢量'將是一個更安全的解決方案:) – icabod

+0

確實。這很麻煩,因爲調用範圍必須取得分配的內存塊的所有權。另外,OP特別要求提供無指針解決方案。 –

4

兩條線改變:

std::vector<double> hour_payload_add(int entries , std::vector<double> array) // HERE 
{ 
    int index=0 ,k=0; 
    int totalpayload=0; 
    std::vector<double> returnarray(entries/120);       // HERE 

    /// .... 

    return returnarray; 
} 

好吧,也許增加一個在頂部

#include <vector> 

對於全獎金,我建議改變它多一點:

std::vector<double> hourgraph(hrentries); 
hourgraph = hour_payload_add(graph); 

// ... 
std::vector<double> hour_payload_add(std::vector<double> array) 
{ 
    const size_t entries = array.size(); 
1

一般來說,你不應該在C++中使用數組,而不是更喜歡使用STL容器類(std::vector是最像陣列一樣)。當然,也有例外,在某些情況下,你應該使用數組(永遠不要說永遠不會),但在你的例子中,我會建議使用vector來代替。

Sehe的回答提供了使用std::vector,並且與陣列的大小初始化它的一個例子:

std::vector<double> returnarray(entries/120); 

這使用一個構造函數,設置所述陣列的默認大小。更有用的矢量可以動態改變大小,並且可以像建議的那樣從函數中返回它。根據編譯器所做的優化,它甚至可能不會創建一個向量的副本 - 但這是依賴於編譯器的。

我的建議是查看關於vector和其他容器的文檔,而不是數組。