2011-09-15 14 views
0

次の14 * 14配列を作成しようとしています。C:[I 0; 0 -I]であり、これは、7×7単位行列の左上から、IDの右下およびゼロを差し引いたものである。C:配列の値を0に初期化する問題

これはメソッドです:

#define DIM 7 

double S[2*DIM][2*DIM]; 

for(i = 0; i < DIM; i++){ 
    for(j = 0; j < DIM; j++){ 
     if(i == j){ 
      S[i][j] = 1.0; 
      S[i+7][j+7] = -1.0; 
     } 
     else{ 
      S[i][j] = 0.0; 
     } 
    } 
} 

これは、すべての対角要素のために正常に動作します。しかし、配列のいくつかの要素はクレイジーな値に初期化されます。例えば、13,6

68111186113812079535019899599437200576833320031036694798491976301968333351950125611739840800974137748034248687763243996679617222196278187875968953700681881752083957666277350377710107236511681624408064.000000

に初期化されるこのエントリ11,1312,912,1013,1213,6に一貫して(少なくとも3回)が起こっているようです。

誰でもここで遊んでいることを教えてもらえますか、代替ソリューションを提供できますか?

乾杯!

EDIT:奇妙なエントリは一貫していません。

EDIT2:誤植:13,12、ない13,15

+1

、申し訳ありません... –

+0

はどのようになっている '13,15'と設定それ? – cwallenpoole

答えて

4

ループは左上象限のみをカバーするため、他の象限の非対角要素は初期化されず、ゴミを含んでいます。あなたのループは、各次元に対して2*DIMになるはずです。対角以外の要素がゼロになると、対角要素の条件は、対角要素を設定する値を決めるのにちょっと複雑になります。

[13,15]は完全にこの配列の外側にあることに注意してください。

+0

もちろんです。私は今、あまりにもスマートではない気がします;-) – trolle3000

1

私は私がJ(対角要素を)==ていない限り、外部の7×7の要素のほとんどは全く初期化されませんと言うでしょう。

どのように初期化しますか?

2

i != ji >= DIMまたはj >= DIMについては、s[i][j]には書き込みません。配列に自動記憶域がある場合(「ローカル」の場合)、任意の初期値が格納されます。

+0

もしそれが 'malloc'されていれば、それはゴミを含むでしょう。 –

+0

はい、しかし、それはmallocedされていません: 'double S [2 * DIM] [2 * DIM]; ' –

+0

私のポイントは、*スタック*またはヒープ上に割り当てられる*それにはゴミが含まれているので、2番目の文の大部分は冗長です。それが自動であるという事実は重要ではない。 –

0

DIM + 1と2 * DIMの間のiまたはjで値を初期化することはありません。したがって、それらの位置の1つに格納された値を見ると、その空間があなたのマトリックスによってアクセスされる前にあったものが見えます。

+1

1つのエラーでオフ... ;-) – DevSolar

1

これは、これらの要素を初期化していないためです。ここではいくつかのより良いコードです:

#define DIM 14 

double S[DIM][DIM]; 

for (i = 0; i < DIM; i++) { 
    for (j = 0; j < DIM; j++) { 
     if (i == j) { 
      if (i < 7) { 
       S[i][j] = 1.0; 
      } else { 
       S[i][j] = -1.0; 
      } 
     } else { 
      S[i][j] = 0.0; 
     } 
    } 
} 
4

あなたはゼロで全体の配列を初期化することができますが、その後、唯一の対角線

double S[2*DIM][2*DIM] = {0}; 
for (i = 0; i < DIM; i++) { 
    s[i][i] = 1; 
    s[i + DIM][i + DIM] = -1; 
} 
削除
+0

ITYM 'double S [2 * DIM] [2 * DIM] = {{0}};' –

+0

@Paul:しかし、 'int {0};'、 'struct {obj [2] [15] = {0};'のような何かを初期化するための '= {0}' "それは**汎用ユニバーサルゼロイニシャライザです** :-) – pmg

+0

これは*働くかもしれませんが、-Wallを使ってgccから警告を生成します: '警告:イニシャライザの周りにカッコがありません'警告:( 'S [0 ] ') ' –