2012-02-13 12 views
7

私はこのようなループがあります。ここでarrayfunctionはすべての配列値を設定し、compute_with_both_arraysはこれらの配列に基づいて数値を計算します。配列は他の配列と同じです

以下の方法で、array1 = array2では動作しません。各ループでarrayfuncionを2回実行せずにこれを行う方法はありますか?

float sum = 0; 

float array1[10]; 
arrayfunction(0, array1); 

for(i=1; i<10; i++) { 
    float array2[10] 
    arrayfunction(1, array2); 

    float s; 
    s = compute_with_both_arrays(array1, array2); 
    sum = sum + s; 

    array1 = array2; 
} 
+6

'array1'は割り当てできません。あなたのスニペットがコンパイルされていれば、コンパイラを削除することをお勧めします。 – pmg

答えて

9

memcpyのような機能を使用して1つのアレイから別のアレイに手動でメモリをコピーする必要があります。例えばので

memcpy(array1, array2, sizeof(array1)); 

それがスタック上に割り当てられた明示的な配列だから、我々はarray1sizeof演算子を使用することができることに注意してください。コメント執筆者が指摘したように、バッファオーバーランを避けるために、宛先のサイズを渡します。静的に割り当てられた配列に対しても同様の手法を実行できますが、は、mallocを使用してヒープ上に動的に割り当てられた配列でを使用できないか、またはポインタへのポインタを使用していることに注意してください。バイトの配列のサイズを明示的に3番目の引数として渡す必要があります。

最後に、for -loopよりもmemcpyを使用することをお勧めします。これは、通常、forループの効率をはるかに超える機械コードレベルの命令を使用して、コンパイラの最適化が有効になっていても。

+0

現代のコンパイラはforループコピーを自動的に 'memcpy'(サイズが小さい場合はアンロールされたコピーシーケンス)の呼び出しに自動的に変換します。つまり、 'memcpy'を呼び出すほうがよいでしょう。 –

+0

安全のためには、常に 'sizeof array2'ではなく' sizeof array1'という出力先配列のサイズを渡すべきです。 – ouah

+0

@ouah:ありがとう、その情報で投稿を更新しました – Jason

関連する問題