Duda sobre crash

Iniciado por Shout, 7 Octubre 2012, 16:20 PM

0 Miembros y 1 Visitante están viendo este tema.

Shout

Hola,

estaba haciendo un simple programa en C++ porque me aburría y, al probarlo, el programa llegaba a cierto punto y se cerraba.

Lo que intento es llenar un array con números [-2000, 2000], guardar los números usados en un bitset (bs[1024] sería 1 si he metido 1024 en el array y 0 si no lo he hecho) y luego, con un for, empezar en -2000 y llegar a 2000 mostrando todos los números que no he usado en el array anterior, y para evitar recorrer el array cada iteración, usé un bitset que consume menos memoria y es más rápido.

El código es este:
Código (cpp) [Seleccionar]
#include <iostream> // std::
#include <stdlib.h> // rand(), srand()
#include <time.h> // time()
#include <bitset> // bitset<>

using namespace std;

int main(){
int a[4000], t;
bitset<2000> used1;
bitset<2000> used2;
srand((unsigned) time(NULL));
for(int i=0;i<4000;i++){
t = rand() % 2000;
a[i] = (rand() % 2 ? t : -t);
if(a[i] >= 0) used1[a[i]] = 1;
else used2[a[i] * (-1)] = 1;
}
cout << "Not used:\n";
for(int i=-2000;i<2000;i++){
if((i >= 0 && !used1[i]) || used2[i * (-1)]) cout << i << " ";
}
cin.get();
return 0;
}


Gracias y saludos
I'll bring you death and pestilence, I'll bring you down on my own

rir3760

El problema que mencionas se debe a la sentencia condicional:
Código (cpp) [Seleccionar]

for (int i = -2000; i < 2000; i++){
   if ((i >= 0 && !used1[i]) || used2[i * (-1)])
      cout << i << " ";
}

Al evaluarse el operando izquierdo de "||":
Código (cpp) [Seleccionar]
(i >= 0 && !used1[i])
Si "i" es mayor o igual a cero y "!used1[ i ]" es cero la condición es falsa y se evalúa la expresión a su derecha:
Código (cpp) [Seleccionar]
used2[i * (-1)]
Y de nuevo: si el valor de "i" es mayor que cero la expresión "i * (-1)" resulta en un indice negativo. Por cierto no hay necesidad de multiplicar por menos uno, puedes utilizar el operador unario "-".

Para que el programa funcione correctamente hay que cambiar el condicional a:
Código (cpp) [Seleccionar]
for (int i = -2000; i < 2000; i++){
   if ((i >= 0 && !used1[i]) || (i < 0 && !used2[-i]))
      cout << i << " ";
}


También debes declarar el bitset "used2" con una capacidad de 2001 elementos (ello porque su elemento con indice cero no es utilizado).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Shout

Muchas gracias, ya lo he solucionado, sabía que los índices negativos no existen, pero mira lo que hacen las prisas  ;-) se puede cerrar
I'll bring you death and pestilence, I'll bring you down on my own