2011-06-21 10 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

これは、 'double returnarray [entries/120];は実行時に決定されます(' C99'で有効) – iammilind

+1

@iammilind:この文脈の "Code"はカウントできない名詞です;したがって、 "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

ok sir thanks alot – sajid

+0

私はこのように関数を定義して呼び出していますが、このスコープではエントリが定義されていないというエラーが出ます。この配列には.arrayが定義されておらず、サイズのインプレースを書くには – sajid

+0

@sajid C++では、配列は固定サイズである必要があります。あなたが評価するのが難しいと思えば、単純にポインタを渡すこともできます。私の答えを編集しました。 – iammilind

1

C++で配列を返すことはできません。メモリへのポインタを返すことになります。

さらに、関数の終了直後にスタックが復元されるため、スタック上にあるローカル宣言された配列へのポインタを返すことはできません。 newまたはmallocを使って動的に割り当てて、その先頭にポインタを戻す必要があります。

+0

できます。 'std :: array'です。コンテナの動的サイズを考慮すると、ここではベクターがより適切です。 –

0

C++の関数からcスタイルの配列を返すことはできません。しかし、はい、あなたはあなたが関数内でローカルに作成されたCスタイルの配列のアドレスを開始返すことができます

関数からstd::arrayコンテナを返すことができますが、その配列は、関数が戻るときをオフにクリアされますし、あなたがして残っていますあなたが望むものではないことを指すポインタ。

newを使用して動的に配列を割り当て、ポインタを返す必要があります。

+0

'std :: array foo(){std :: array ar {0,1,2}; return 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

私はあなたの3番目の方法を使用してこれを行っていますか?このようにhour_payload_add(entries、graph、およびhourgraph)と呼んでいます。親切にも、私が間違っているところで私に指導してください。 – sajid

+0

@sehe答えを見てください - 彼はあなたに完全な機能を与えました。 –

+0

ok sirありがとうございました – 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; 
} 

配列を使用した後:だからあなたの関数は、このようにする必要があり

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 'delete []'の重要性に言及して+1しても、 ''ベクトル 'を使うとより安全な解決策になると思います:) – icabod

+0

確かに。呼び出しスコープが割り当てられたメモリブロックの所有権を取得する必要があるため、これは面倒です。また、OPは具体的にはポインタレスのソリューションを求めました。 –

4

の2行が変更されました:

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> 
に1を追加完全なボーナスのために

は、私はもう少しそれを変更することをお勧め:

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

あなたの代わりにSTLコンテナクラスを使用することを好む、C++で配列を使用しないでください(std::vectorですほとんどの配列のようなもの)。もちろん例外がありますが、場合によっては配列を使うべきではありませんが、あなたの例では代わりにvectorの使用を提案します。

Seheの答えはstd::vectorを使用して、配列の大きさでそれを初期化する例を示します。

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

これは、アレイのデフォルトサイズを設定し、コンストラクタを使用しています。より便利なことに、ベクトルはサイズを動的に変更することができ、提案されているように、関数から関数を戻すことができます。コンパイラによって行われる最適化によっては、ベクトルのコピーを作成しない場合もありますが、これはコンパイラに依存します。

私の提案は、vectorと他のコンテナのドキュメントを配列よりも優先して見ることです。

関連する問題