C: проблема с инициализацией значений массива в ноль - PullRequest
0 голосов
/ 15 сентября 2011

Я пытаюсь построить следующий массив 14 * 14 i C: [I 0; 0-I], то есть тождественная матрица 7 * 7 вверху слева, минус единица справа внизу и нули в противном случае.

Это метод:

#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,12 и 13,6.

Кто-нибудь может сказать мне, что здесь происходит, или предложить альтернативное решение?

Ура!

РЕДАКТИРОВАТЬ: странные записи не согласованы.

EDIT2: опечатка: 13,12, а не 13,15

Ответы [ 6 ]

4 голосов
/ 15 сентября 2011

Вы можете инициализировать весь массив нулями, затем установить только диагональ

double S[2*DIM][2*DIM] = {0};
for (i = 0; i < DIM; i++) {
    s[i][i] = 1;
    s[i + DIM][i + DIM] = -1;
}
4 голосов
/ 15 сентября 2011

Ваш цикл охватывает только верхний левый квадрант, поэтому недиагональные элементы в других квадрантах не инициализируются и содержат мусор.Ваш цикл должен увеличиваться до 2*DIM для каждого измерения, так что недиагональные элементы обнуляются, и тогда ваше условие для диагональных элементов должно быть немного сложнее, чтобы решить, какое значение установить для диагонального элемента.

Обратите внимание, что [13, 15] находится полностью вне этого массива!

2 голосов
/ 15 сентября 2011

Вы никогда не пишете в s[i][j] для i != j и i >= DIM или j >= DIM. Если ваш массив имеет автоматическое хранение («локально»), он содержит произвольные значения инициализации.

1 голос
/ 15 сентября 2011

Это потому, что вы не инициализируете эти элементы.Вот лучший код:

#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;
        }
    } 
}
1 голос
/ 15 сентября 2011

Я бы сказал, что большинство элементов, которые находятся за пределами 7x7, вообще не будут инициализированы, если только i == j (диагональные элементы).

Чем вы хотите их инициализировать?

0 голосов
/ 15 сентября 2011

Вы никогда не инициализируете значения с i или j между DIM + 1 и 2 * DIM.Поэтому, когда вы смотрите на значение, хранящееся в одной из этих позиций, вы видите все, что было до того, как ваша матрица получила доступ к этому пространству.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...