b の値を使用して、a の新しい値を決定します。データの収束を確認する while ループを通過します。
その場合、次のように配列を前後に切り替えると、コピーを回避できる場合があります(これは、あなたが書いたものとは逆です。必要に応じて調整してください)。
double array1[SIZE], array2[SIZE];
double* a = array1, double* b = array2;
generate_initial_values(array1);
for (;;)
{
// do either
memcpy(b, a, sizeof array1); // sizeof either array will do; *don't* use sizeof a or b, which is only the size of the pointer, not of the array
update_values_in_b(b);
// or, better:
produce_modified_values_in_b_from_a(a, b);
if (converged(a, b)) break;
// switch arrays
double* temp_ptr = a;
a = b;
b = temp_ptr;
}
それがうまくいく場合は、2番目の方法で行う方が高速です。memcpy が必要な場合は、非常に高速な memcpy for image processing?の内容を試すことができます。ですが、おそらく memcpy を使用して、コンパイラの最適化レベルをできるだけ高く設定するのが最善の方法です。#include <string.h>
memcpy への size 引数がコンパイル時の定数 (上記) であることを確認し、生成されたアセンブリ コードを調べて、コンパイラがコピーをインライン化していることを確認します。
編集:待ってください、配列を切り替える必要さえない別の考えがあります:
double a[SIZE], b[SIZE];
generate_initial_values(a);
for (;;)
{
produce_modified_values_in_second_array_from_first(a, b);
if (converged(a, b)) break;
produce_modified_values_in_second_array_from_first(b, a);
if (converged(b, a)) break;
}
ループを終了すると、どの配列に最新の値があるかわかりませんが、それらが収束した場合はおそらく気にしません。その場合は、最新の値へのポインターを設定するか、関数を使用できます。
void calling_function(void)
{
...
double a[SIZE], b[SIZE];
generate_initial_values(a);
double* great_values = get_great_values(a, b); // returns either a or b
...
}
double* get_great_values(double* a1, double* a2)
{
for (;;)
{
produce_modified_values_in_second_array_from_first(a1, a2);
if (converged(a1, a2)) return a2;
produce_modified_values_in_second_array_from_first(a2, a1);
if (converged(a2, a1)) return a1;
}
}