2012-04-04 12 views
1

各要素が前の要素に依存する配列のセットを構築しています。初期値を設定するための洗練された解決策がありません。コードは次のようになります。各要素が前の要素に依存する配列を構築する

int A[1024]; 
int B[1024]; 
/* ... more arrays... */ 
int i; 
for (i = 0; i < 1024; i++) { 
    /* do some work */ 
    A[i] = A[i-1] + some_value(); 
    B[i] = B[i-1] + some_other_value(); 
    /* ... and so on... */ 
} 

しかし、もちろん、これは不正なメモリアクセスが、私はすべての配列の初期値がなければならないことを知っているiが0の場合は0である。

にはいくつかの方法があります。この問題を解決します。私は巨大なif文をループに入れて、iが0かどうかを調べることができました。それはtrueに一度しか評価されないので、厄介なようです。最後の反復の値を保持するprev_val_of_Aなどと呼ばれる配列ごとに、一時変数を0に初期化しておくことができました。私はすべての反復の終わりに現在の値に更新する必要があります。ほとんどの場合、私が望む値は配列の前の要素のすぐそばに座っているので、これはちょっとばかげているようです。私は配列の意味を知ることができ、配列のの2番目の要素には、ループの最初のの反復のの値が含まれています。つまり、ループ内で、A[0]を初期化し、A[1025]のために割り当てる。これは混乱を招くようだとAのさらなる使用上のエラーを誘うかもしれない

A[i+1] = A[i] + some_value(); 

ください。

私は、この問題を解決するためにクリーンでエレガントな提案を探しています。

答えて

2

これを解決する最も簡単な方法は、A[0],B[0]などを初期化してから、ループをi = 1から開始することです。すなわち

int A[1024]; 
int B[1024]; 
/* ... more arrays... */ 
int i; 

A[0] = stuff(); 
B[0] = other_stuff(); 
/* etc */ 

for (i = 1; i < 1024; i++) { 
    /* do some work */ 
    A[i] = A[i-1] + some_value(); 
    B[i] = B[i-1] + some_other_value(); 
    /* ... and so on... */ 
} 

EDIT:そして、それは数学を反映して、これは、合理的にelegentです:nの場合のシーケンスは、多くの場合f(0) = xf(n) = <stuff with f(n-1)>によって定義されています> 0)

+0

私はそれを動作させることができればこれが最もよいと私は同意します。それは確かに最も自然なことです(そして私は質問でそれを言及すべきでした)。問題は、 '/ * do some work * /'は 'i = 0'でも発生する必要があるということです。おそらく、私はループを再考する必要があります。 –

0

どう以下について:

int AX[1024+1]; 
int BX[1024+1]; 
int *A = AX+1, *B = BX+1; 
AX[0] = 0; 
BX[0] = 0; 

/* ... more arrays... */ 
int i; 
for (i = 0; i < 1024; i++) { 
    /* do some work */ 
    A[i] = A[i-1] + some_value(); 
    B[i] = B[i-1] + some_other_value(); 
    /* ... and so on... */ 
} 
+0

あなたは単純な問題にもっと曖昧さを加えましたが、正しいです – UmNyobe

+0

@UmNyobe:いいえ、それはi = 0です。 AXは最初に1024の値と開始値を持っています。したがって、Samsアルゴリズムは変更されていませんが、A [0]、B [0]、...の計算のための初期化された値を持っています。 –

+0

ええ私は気づいた...しかしそれはエレガントで清潔ではない... – UmNyobe

0

概念的には、あなたの配列は初期値とreccurenceの関係として定義されています。だから、ループの外で最初の要素を初期化して、ループで次の値を計算してください。なぜそれがかわいくないのか分かりません。

+0

合意が、dbauppの答え​​に私のコメントを参照してください。 –

関連する問題