Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Shout en 7 Octubre 2012, 16:20 pm



Título: Duda sobre crash
Publicado por: Shout en 7 Octubre 2012, 16:20 pm
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
  1. #include <iostream> // std::
  2. #include <stdlib.h> // rand(), srand()
  3. #include <time.h> // time()
  4. #include <bitset> // bitset<>
  5.  
  6. using namespace std;
  7.  
  8. int main(){
  9. int a[4000], t;
  10. bitset<2000> used1;
  11. bitset<2000> used2;
  12. srand((unsigned) time(NULL));
  13. for(int i=0;i<4000;i++){
  14. t = rand() % 2000;
  15. a[i] = (rand() % 2 ? t : -t);
  16. if(a[i] >= 0) used1[a[i]] = 1;
  17. else used2[a[i] * (-1)] = 1;
  18. }
  19. cout << "Not used:\n";
  20. for(int i=-2000;i<2000;i++){
  21. if((i >= 0 && !used1[i]) || used2[i * (-1)]) cout << i << " ";
  22. }
  23. cin.get();
  24. return 0;
  25. }
  26.  

Gracias y saludos


Título: Re: Duda sobre crash
Publicado por: rir3760 en 7 Octubre 2012, 17:24 pm
El problema que mencionas se debe a la sentencia condicional:
Código
  1. for (int i = -2000; i < 2000; i++){
  2.   if ((i >= 0 && !used1[i]) || used2[i * (-1)])
  3.      cout << i << " ";
  4. }
  5.  
Al evaluarse el operando izquierdo de "||":
Código
  1. (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
  1. 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
  1. for (int i = -2000; i < 2000; i++){
  2.   if ((i >= 0 && !used1[i]) || (i < 0 && !used2[-i]))
  3.      cout << i << " ";
  4. }

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


Título: Re: Duda sobre crash
Publicado por: Shout en 10 Octubre 2012, 21:38 pm
Muchas gracias, ya lo he solucionado, sabía que los índices negativos no existen, pero mira lo que hacen las prisas  ;-) se puede cerrar