2016-04-24 28 views
-2

私はかなりc/C++に新しいです。私は遺伝的アルゴリズム(MS Visual Studio 2013を使用)のプログラムを構築しようとしています。私はあなたにこのプログラムの詳細を惜しみませんが、私は 'パラメータを参照渡し'に問題があります。 関数内の別の関数を参照してパラメータを渡すことはできますか?以下に、私のコードの簡単な例を見つけることができます。関数の別の関数への参照によってパラメータを渡す

struct solution{ 
int list1[100]; 
int list2[100]; 
int list3[100]; 
int list4[100]; 
}; 

void function1(solution& foo) 
{ 
// Algorithm that fills list2 
function2(foo); // Fills in list3 
function3(foo); // Fills in list4 
} 

void function2(solution& foo) 
{ 
// algorithm to fill in list3 
} 

void function3(solution& foo) 
{ 
// algorithm to fill in list4 
} 

void localSearch(solution& foo) 
{ 
for(int i = 0; i < 10; i++) 
{ 
    // Change a random value in list1 of foo 
    // Rerun function1 and see if it is a better solution 
    function1(foo); 
} 
} 

int main() 
{ 
solution bar; 
// Fill list1 of bar randomly by other function 

function1(bar); 
// Output finished solution 

return 0; 
} 

私はこれを行うにしようとすると、私はエラーのすべての種類を取得...それに続いて、私の解決策の構造体が壊れおよびリスト1の最初の位置がランダムに戻っ0 への変更私はにいくつかのことを試してみましたこれを緩和しますが、何も動作していないようです。私がfunction1の値を使って解決策を渡しただけでは、プログラムが実行されているように見えますが、この大きな構造体をコピーする必要があるため、処理が遅くなります。

は、だから私の質問は以下のとおりです。

1)それははfunction1に、別の関数に参照によって渡されたパラメータに()参照渡しすることは可能ですか?

2)もっと良い解決策はありますか?

+0

問題を解決するにはどうすればいいですか?特別な構文は必要ありません。 –

+1

'function2'と' function3'を前方宣言する必要があると思います。なぜなら、それらをdelcaringせずに 'function1'で使用しているからです。あるいは、両方を 'function1'の上に移動することもできます。 – PcAF

+0

**あなたの投稿を**エラーメッセージのサンプルで編集してください(最初の10ページを見てみましょう)。 –

答えて

0

1)function1の別の関数への参照によって渡されたパラメータに(参照によって)渡すことはできますか?

はい、別の関数を参照して同じ変数を渡すことは可能です。

フォワード宣言は、関数の使用方法(構文)をコンパイラーに見せてくれます。前方宣言がなければ、コンパイラはその定義から知識を得るでしょう。ただし、定義または前方宣言は関数呼び出しの前に来なければなりません。

2)もっと良い解決策はありますか?
1)の代わりに配列のstd::vectorを使用します。

はここにあなたのソリューションを改善するためのいくつかのアイデアです。

2)構造のstd::vectorはなく、アレイの構造を検討してください:

struct List_Record 
    { 
     int item1; 
     int item2; 
     int item3; 
     int item4; 
    }; 
    std::vector<List_Record> My_Lists(100); 
// or 
    List_Record My_Array[100]; 

すべての項目に(構造内の項目を有するか、またはレコードは、プロセッサによってより良好なデータ・キャッシュ管理を可能にします行は連続して配置されます)。

3)初期化のために構造内にメソッドを作成します。
データ項目をデフォルト値でロードするコンストラクタが必要です。
ファイルからデータ項目を読み込むメソッドを追加することを検討してください(テストには非常に便利です)。

関連する問題