C Изменение массива, вызывающее изменение переменной - PullRequest
0 голосов
/ 30 ноября 2010

Я пытаюсь изменить значение в массиве, используя язык программирования Си, и мне кажется, что я зашел в тупик с этой, казалось бы, простой операцией.Пожалуйста, посмотрите фрагмент кода ниже:

while(1) {
        printf("Current prime candidate is %i\n",nextPrimeCandidate);
        int innerSieve;//=2;
        int currentPrimeCandidate=0;

        for (innerSieve=2;innerSieve<SIEVELIMIT;innerSieve++) {
            currentPrimeCandidate = nextPrimeCandidate * innerSieve;
            //printf("Inner Sieve  is b4 funny place %i,%i\n",innerSieve,currentPrimeCandidate);

            //initArray[currentPrimeCandidate]=5;
            //VERY UNIQUE LINE
            myArray[currentPrimeCandidate] = 0;



            //printf("Inner Sieve after funny place is %i,%i \n",innerSieve,currentPrimeCandidate);

        }
        nextPrimeCandidate=getNextPrimeCandidate(myArray,++nextPrimeCandidate);
        if ((nextPrimeCandidate^2) > SIEVELIMIT ) break;

    }

Проблема в строке, выделенной комментарием VERY UNIQUE LINE.По какой-то причине, когда переменная innerSieve достигает 33 и попадает в эту строку, она устанавливает содержимое переменной innerSieve в значение этой строки (которое в настоящее время равно 0) и в основном вынуждает цикл в бесконечный цикл (SIEVELIMITпеременная установлена ​​на 50).Кажется, что в регистрах происходит что-то смешное, когда я проверяю с помощью средства отладки Eclipse, но я не совсем уверен, что мне нужно искать.

Если вам нужен полный листинг кода, это может(с конкретной переменной, которая еще не инициализирована в коде, инициализируемом в тот момент, когда переменная innerSieve достигает 32)

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 30 ноября 2010

@ ruslik нажал на это в комментарии. Проблема в этой строке:

if ((nextPrimeCandidate^2) > SIEVELIMIT ) break;

В C оператор ^ является , а не оператором мощности, это оператор побитовый xor . Вы выполняете итерацию слишком много раз, чем намереваетесь, что приводит к ошибке индексации массива вне пределов, поэтому вы перезаписываете случайную память и получаете странные результаты.

В C нет оператора мощности (хотя есть функция pow). Поскольку вы просто возводите число в квадрат, самое простое решение - умножить число на себя:

if ((nextPrimeCandidate * nextPrimeCandidate) > SIEVELIMIT ) break;
4 голосов
/ 30 ноября 2010

Предполагая, что currentPrimeCandidate больше максимального индекса myArray, вы перезаписываете innerSieve (что, вероятно, следует за myArray в стеке).

...