Frage

Ich versuche, einen Wert in einem Array zu modifizieren, um die C-Programmiersprache und ich scheine eine leere Wand mit dieser scheinbar einfachen Bedienung zu schlagen. Bitte siehe Code-Schnipsel unten:

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 Zeile mit dem VERY UNIQUE LINE Kommentar hervorgehoben. Aus irgendeinem Grund, wenn die innerSieve variable 33 und erhält auf diese Zeile erreicht, wird er den Inhalt der innerSieve Variable stellt den Wert der Zeile (die zur Zeit 0) und zwingt grundsätzlich die Schleife in einer Endlos-Schleife (die SIEVELIMIT Variable ist eingestellt auf 50). Es scheint, dass es einige lustigen Sachen ist in den Registern los, wenn ich mit der Eclipse-Debug-Anlage überprüft, aber ich bin nicht sicher, was ich achten soll.

Wenn Sie die gesamten Code-Auflistung benötigen, können diese zur Verfügung gestellt werden. (Mit einer bestimmten Variablen, die in dem Code noch nicht initialisiert wird genau an der Stelle initialisiert werden, dass die innerSieve Variable 32 Treffer)

Jede Hilfe wird sehr geschätzt.

War es hilfreich?

Lösung

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

Andere Tipps

@ruslik Hit auf es in dem Kommentar. Das Problem ist, diese Zeile:

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

In C, der ^ Operator nicht der Strom Betreiber ist es der bitweise xor Operator. Du bist Iterieren viel zu oft, als Sie beabsichtigen, die in einem Array-Index-out-of-bounds-Fehler führt, so dass Sie gelegentliches Gedächtnis sind überschreiben und seltsame Ergebnisse.

Es gibt keine Macht Operator in C (obwohl es die pow -Funktion). Da Sie nur eine Reihe quadrieren, ist die einfachste Lösung ist die Zahl mit sich selbst zu multiplizieren:

if ((nextPrimeCandidate * nextPrimeCandidate) > SIEVELIMIT ) break;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top