2010-11-30 12 views
0

Ich versuche, einen Wert in einem Array mit der Programmiersprache C zu ändern, und ich scheine mit dieser scheinbar einfachen Operation eine leere Wand zu treffen. Bitte beachten Sie Codeausschnitt unten:C Array-Änderung verursacht Variablenänderung

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; 

    } 

Das Problem ist mit der Linie markiert mit dem VERY UNIQUE LINE Kommentar. Wenn die innerSieve-Variable 33 erreicht und an diese Zeile gelangt, setzt sie aus irgendeinem Grund den Inhalt der innerSieve-Variablen auf den Wert dieser Zeile (der aktuell 0 ist) und zwingt die Schleife im Grunde in eine Endlosschleife (die SIEVELIMIT-Variable ist) eingestellt auf 50). Es scheint, dass einige lustige Dinge in den Registern ablaufen, wenn ich mit der Eclipse-Debug-Funktion überprüfte, aber ich bin mir nicht sicher, wonach ich suchen sollte.

Wenn Sie den gesamten Code-Eintrag benötigen, können diese zur Verfügung gestellt werden. (Mit einer bestimmten Variablen, die in dem Code initialisiert noch nicht an dem genauen Punkt initialisiert wird, dass die innerSieve Variable trifft 32)

Jede Hilfe wird sehr geschätzt werden.

+2

Und was bedeutet 'if ((nextPrimeCandidate^2)> SIEVELIMIT) break;' bedeutet? – ruslik

+0

Ich habe anscheinend versucht zu überprüfen, ob 'nextPrimeCandidate' auf die Potenz von 2 erhöht war größer als' SIEVELIMIT' aber nach dem Lesen Adam Rosenfields Antwort unten, ich sollte wirklich vergessen meine JAVA Erfahrung im Umgang mit C –

Antwort

4

Erraten, dass currentPrimeCandidate größer ist als der maximale Index von myArray, und Sie überschreiben innerSieve (was wahrscheinlich myArray auf dem Stapel folgt).

+0

Ja, in Ihrem inneren Schleife versuchen limitierend durch 'SIEVE_LIMIT' (das sollte die tatsächliche Länge des Arrays sein!) der Wert von' currentPrimeCandidate' und nicht von 'innerSieve'. – ruslik

4

@ruslik traf es im Kommentar. Das Problem ist, diese Zeile:

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

In C, der ^ Operator ist nicht die Macht Operator, es ist der xor Operator bitweise ist. Sie durchlaufen viel zu oft, als Sie beabsichtigen, was zu einem Array-Index-Out-of-Bounds-Fehler führt, sodass Sie zufälligen Speicher überschreiben und seltsame Ergebnisse erhalten.

In C gibt es keinen Energieoperator (obwohl es die pow-Funktion gibt). Da Sie nur eine Zahl quadriert, ist die einfachste fix die Zahl mit sich selbst zu multiplizieren:

if ((nextPrimeCandidate * nextPrimeCandidate) > SIEVELIMIT) break; 
+0

Ich wusste eigentlich nicht, dass C keinen expliziten Power Operator hat! Ich hatte das Problem mit tomlogics Antwort behoben, aber jetzt, wo Sie das hinzugefügt haben, muss ich vielleicht zurückgehen und überprüfen, was ich getan habe. Vielen Dank! –