elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda sobre crash
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre crash  (Leído 1,956 veces)
Shout

Desconectado Desconectado

Mensajes: 191


Acid


Ver Perfil
Duda sobre crash
« 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


En línea

I'll bring you death and pestilence, I'll bring you down on my own
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda sobre crash
« Respuesta #1 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


En línea

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

Desconectado Desconectado

Mensajes: 191


Acid


Ver Perfil
Re: Duda sobre crash
« Respuesta #2 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
En línea

I'll bring you death and pestilence, I'll bring you down on my own
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Smartcheck + Crash
Ingeniería Inversa
APOKLIPTICO 8 6,575 Último mensaje 31 Octubre 2008, 23:27 pm
por apuromafo CLS
Crash en IE
Hacking
dimitrix 8 4,716 Último mensaje 13 Junio 2011, 20:53 pm
por dimitrix
duda add esp, 4 y crash
ASM
asmnb 6 6,107 Último mensaje 14 Agosto 2011, 05:46 am
por asmnb
Crash en la consola
Programación C/C++
7erran 3 3,037 Último mensaje 5 Abril 2021, 04:24 am
por @XSStringManolo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines