2010-11-30 3 views
0

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

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

А что делает `если ((^ 2)> SIEVELIMIT nextPrimeCandidate) перерыв;` означает? – ruslik 2010-11-30 00:44:40

+0

Я, по-видимому, пытался проверить, повысил ли `nextPrimeCandidate` до 2-го уровня больше, чем` SIEVELIMIT`, но после прочтения ответа Адама Розенфилда ниже, я должен действительно забыть о своем опыте JAVA при работе с C – 2010-11-30 16:39:48

ответ

4

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

+0

Да, в вашей внутренней петле попробуйте ограничение на `SIEVE_LIMIT` (это должна быть фактическая длина массива!) значение` currentPrimeCandidate`, а не `innerSieve`. – ruslik 2010-11-30 00:47:12

4

@ruslik ударил по нему в комментарии. Проблема заключается эта линия:

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

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

В C нет силового оператора (хотя есть функция). Так как вы только квадратуру число, самое простое исправление умножить число само по себе:

if ((nextPrimeCandidate * nextPrimeCandidate) > SIEVELIMIT) break; 
Смежные вопросы