2011-09-15 4 views
0

다음 14 * 14 배열을 만들려고합니다. C : [I 0; 0 -I], 즉 7 * 7 항등 행렬 왼쪽 상단, 그렇지 않은 경우에는 오른쪽 하단 및 0을 나타냅니다. 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,13, 12,9, 12,10, 13,1213,6에 지속적으로 (적어도 세 번) 일어나는 것 같습니다.

아무에게도 재생할 수있는 것을 알려주거나 대체 솔루션을 제공 할 수 있습니까?

건배!

EDIT : 이상한 항목이 일치하지 않습니다.

EDIT2 : 오타 : 13,12하지 13,15

+1

, 죄송합니다 ... –

+0

가 어떻게 점점'13,15'로 설정 그? – cwallenpoole

답변

4

루프는 왼쪽 위 사분면 만 다루기 때문에 다른 사분면의 대각선이 아닌 요소는 초기화되지 않고 쓰레기가 포함됩니다. 루프가 각 차원에 대해 2*DIM까지 올라야 비대 각 요소가 0이되고 대각 요소에 대한 조건은 대각 요소를 설정할 값을 결정하기 위해 좀 더 복잡해야합니다.

[13, 15]는이 배열 외부에 있습니다.

+0

물론. 나는 지금 너무 똑똑하다고 느껴지지 않는다 ;-) – trolle3000

1

내가 밖에서 7 × 7을있는 요소의 대부분을 말할 것은 초기화되지 않습니다 모든 내가 == J (대각선 요소)를 제외하고.

무엇을 초기화 하시겠습니까?

2

i != ji >= DIM 또는 j >= DIM에 대해서는 s[i][j]에 절대로 쓰지 않습니다. 배열에 자동 저장 장치가 있으면 ("local") 임의의 init 값이 들어 있습니다.

+0

'malloc'으로 설정 한 경우 쓰레기가 포함됩니다. –

+0

예,하지만 malloced되지 않습니다 :'double S [2 * DIM] [2 * DIM]; ' –

+0

요점은 * 스택 *이나 힙에 할당된다는 것입니다. 그것은 쓰레기를 포함하고있어서, 두 번째 문장의 대부분은 중복됩니다. 그것이 자동이라는 사실은 중요하지 않습니다. –

0

DIM + 1과 2 * DIM 사이의 i 또는 j로 값을 초기화하지 마십시오. 그래서 그 위치들 중 하나에 저장된 값을 보면 매트릭스가 그 공간에 접근하기 전에 그곳에 있었던 값을 볼 수 있습니다.

+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

당신은 0으로 전체 배열을 초기화 할 수는 만 대각선

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 ] ')' –