Pregunta

Estoy intentando modificar un valor en una matriz utilizando el lenguaje de programación C y que parece estar golpeando una pared en blanco con este aparentemente fácil operación. Por favor, véase el fragmento de código a continuación:

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;

    }

El problema es con la línea resaltada con el comentario VERY UNIQUE LINE. Por alguna razón, cuando la variable innerSieve alcanza 33 y llega a esa línea, se establece el contenido de la variable innerSieve al valor de esa línea (que actualmente es 0) y, básicamente, obliga al bucle en un bucle infinito (la variable SIEVELIMIT es fijado en 50). Parece que hay algunas cosas divertidas sucediendo en los registros cuando me registré usando las instalaciones de depuración de Eclipse, pero no estoy muy seguro de lo que debería estar buscando.

Si necesita todo el listado de código, que puede ser aportada. (Con una variable en particular que aún no se ha inicializado en el código que está siendo inicializado en el punto preciso que la variable innerSieve golpea 32)

Cualquier ayuda será muy apreciada.

¿Fue útil?

Solución

El conjeturar que currentPrimeCandidate es mayor que el índice máximo de myArray, y se desea sobreescribir innerSieve (que probablemente sigue myArray en la pila).

Otros consejos

golpe @ruslik en ella en el comentario. El problema es que esta línea:

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

En C, el operador ^ es no el operador de potencia, es el XOR bit a bit operador. Usted es iterar demasiadas veces de las que usted tiene la intención, que se traduce en una matriz de índice fuera de los límites de error, por lo que se desea sobreescribir la memoria aleatoria y obtener resultados extraños.

No hay operador el poder en C (aunque hay la href="http://linux.die.net/man/3/pow" rel="nofollow"> pow función ). Puesto que usted está cuadrando un número, la solución más sencilla consiste en multiplicar el número por sí mismo:

if ((nextPrimeCandidate * nextPrimeCandidate) > SIEVELIMIT ) break;
scroll top