Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Violación de segmento usando deque

Estas en el tema de Violación de segmento usando deque en el foro de C/C++ en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #include <deque> using std :: deque ;   #include <iostream> using std :: cout ; using std :: endl ...
  #1 (permalink)  
Antiguo 02/03/2013, 01:56
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Violación de segmento usando deque

Código C++:
Ver original
  1. #include <deque>
  2. using std::deque;
  3.  
  4. #include <iostream>
  5. using std::cout;
  6. using std::endl;
  7.  
  8. int main()
  9. {
  10.     deque<unsigned short> number;
  11.     deque<unsigned short>::iterator it;
  12.     int remainder = 0;
  13.     int temp;
  14.  
  15.     number.push_back(1);
  16.  
  17.     for(int i = 2; i <= 100; i++)
  18.     {
  19.         it = number.end();
  20.  
  21.         while(it != number.begin())
  22.         {
  23.             temp = ( (*it--) * i) + remainder; // OCURRE AQUÍ
  24.             if(i == 100)
  25.                 number.push_front(temp);
  26.             else
  27.             {
  28.                 remainder = temp % 10;
  29.                 number.push_front(temp);
  30.             }
  31.  
  32.         }
  33.     }
  34.  
  35.     it = number.begin();
  36.  
  37.     while(it != number.end())
  38.         cout << *it++;
  39.  
  40.     return 0;
  41.  
  42. }

Marqué dónde ocurre la violación de segmento, además, sé que el loop se ejecuta varias veces, y al final entra en una violación de segmento y no entiendo por qué...

¿Alguien me podría explicar/ayudar?

Saludos!
  #2 (permalink)  
Antiguo 04/03/2013, 00:44
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 10 meses
Puntos: 127
Respuesta: Violación de segmento usando deque

Porque, efectivamente, estás realizando una violación de segmento.

Al usar un postdecremento y dereferenciar, no se dereferencia el iterador decrementado sino el iterador aún sin decrementar

Código C++:
Ver original
  1. *(it--); // es el iterador end()
  2.  
  3. it--;
  4. *it // es end() - 1, es correcto

La forma es simplemenete usando un predecremento

Código C++:
Ver original
  1. *(--it);

ergo

Código C++:
Ver original
  1. temp = ( *(--it) * i) + remainder;

Luego, si usas push_front la referencia al iterador end decrementado deja de ser válida a la segunda ejecución de while, por lo que necesitas renovarlo, y en cualquier caso da bucle infinito.

En general no entiendo muy bien la lógica de tu código, será que estoy falto de café o que me acabo de levantar.

Recuerda que si cambias la estructura del queue o del vector la estructura del vector/queue cambia, y los iteradores son referencias completas al elemento referido con referencias tanto al objeto como al trozo de memoria donde se almacena. Cuando incrementas o decrementas el iterador este se mueve en el contexto en que se creó, entonces, si añades un elemento al principio, todo el queue se recoloca moviendo los objetos hacia delante y aumentando en 1 su tamaño, entonces el iterador ya no es válido y has de volver a referenciarlo con respecto a su final, al principio y cualquier referencia absoluta mediante [index].

Para ciertas cosas puedes usar iteradores reversos com crend y rbegin, entre otros, en que el incremento va hacia atrás, etc.

Un saludo
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 04/03/2013 a las 01:30

Etiquetas: int, segmento, usando
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:35.