C: странное поведение с вложенным циклом и массивом - PullRequest
3 голосов
/ 10 июля 2011

У меня есть массив int, оканчивающийся на '\ 0', созданный в другом месте моего кода. Я знаю, что это нулевое завершение, потому что я проверял это.

Скажем, для этого примера массив [7, 8, 9, 11, 12, '\ 0']

Когда я передаю его своей функции:

int edgesInCluster(Graph *g, int *nodes) {
    int count = 0;
    int i = 0;
    int j = 0;
    while(nodes[i] != '\0') {
        while(nodes[j] != '\0') {
            if(i<j) {
                printf("%i %i\n", nodes[i], nodes[j]);
                count += isNeighbour(g, nodes[i], nodes[j]);
            }
            j++;
        }
        i++;
    }
    return count;
}

printf выводит:

7 7
7 8
7 9
7 11
7 12

Когда должно быть выведено:

7 8
7 9
7 11
7 12
8 9
8 11
8 12
9 11
9 12
11 12

Это означает, что по какой-то причине 'i' не увеличивается (но мы можем видеть, что это так), или узлы [0] == '\ 0', что, как мы знаем, неверно, поскольку цикл с ' J 'отлично работает.

Итак, есть идеи, что происходит?

P.S. когда я изменяю циклы while на for, это работает, но только если я знаю длину 'узлов'

Ответы [ 2 ]

4 голосов
/ 10 июля 2011

Вы не сбрасываете j после внутреннего цикла.

Но почему такой ужасно подробный код? Попробуйте это:

size_t count = 0;

for (size_t i = 0; nodes[i]; ++i)
{
  for (size_t j = i + 1;  nodes[j]; ++j)
  {
    printf("%i %i\n", nodes[i], nodes[j]);
    count += isNeighbour(g, nodes[i], nodes[j]);
  }
}

return count;

(Если вы хотите строгий ANSI C89, вы, конечно, должны извлекать декларации i и j из циклов.)

Также обратите внимание, что '\0' является char -литералом значения 0, так что вы могли бы точно так же, и более правильно, сказать, 0. И вместо if (x != 0) вы можете просто сказать if (x), что я и сделал в циклах for.

1 голос
/ 10 июля 2011

Вы не сбрасываете значение для j в начале цикла j. Таким образом, после первого цикла nodes[j] равен '\0' для всех последующих циклов, немедленно отменяя цикл j.

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