Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JulioRL8 en 14 Junio 2016, 17:17 pm



Título: Error de ejecucion
Publicado por: JulioRL8 en 14 Junio 2016, 17:17 pm
Buenas, soy estudiante de primero de ingenieria informatica y tengo el siguiente problema. En el uso del siguiente metodo me sale un error que dice segmentation fault (core dumped). Creo entender que hago un mal uso de algun puntero y por eso me sale.

Este es el metodo:
Código
  1. void insertar(string cadena){
  2.    Celda *puntero;
  3.    puntero = cabecera;
  4.    while(puntero->siguiente != 0){
  5.        puntero = puntero->siguiente;
  6.    }
  7.    puntero->datos=cadena;
  8.    puntero->siguiente= new Celda;
  9. }

Y esta la clase y el struct que  se utiliza:
Código
  1. struct Celda{
  2. string datos; ///valor de la celda actual
  3. Celda * siguiente;  ///puntero al siguiente elemento de la lista
  4. };
  5.  
  6. class Lista{
  7.  
  8. private:
  9.   Celda * cabecera;
  10. public:
  11. //metodos...


Título: Re: Error de ejecucion
Publicado por: class_OpenGL en 14 Junio 2016, 18:10 pm
No sé muy bien cómo tenías planteado resolver el problema. Yo solo me voy a limitar a señalar el por qué te crashea el programa (segmentation fault). Este error se produce cuando intentas acceder a un área de la memoria que no está reservada para tu programa.

No sé el error exactamente pues no has puesto suficiente código, pero probablemente se esté produciendo porque no has inicializado correctamente la variable cabecera. En el constructor tendrías que haber hecho algo así:

Código
  1. Lista::Lista() {
  2.    cabecera = NULL;
  3. }


Y en la función insertar, algo así:

Código
  1. void insertar(string cadena){
  2.    Celda *puntero;
  3.    puntero = cabecera;
  4.  
  5.    if(NULL != puntero) { // Tienes que comprobar si hay datos o no
  6.        while(NULL != puntero->siguiente)
  7.            puntero = puntero->siguiente;
  8.  
  9.        puntero->siguiente = new Celda;
  10.        puntero->siguiente->siguiente = NULL; // Tienes que inicializar
  11.        puntero->sigueinte->datos = cadena;
  12.    } else {
  13.        cabecera = new Celda;
  14.        cabecera->siguiente = NULL; // Tienes que inicializar
  15.        cabecera->datos = cadena;
  16.    }
  17. }


Título: Re: Error de ejecucion
Publicado por: JulioRL8 en 14 Junio 2016, 19:47 pm
No sé muy bien cómo tenías planteado resolver el problema. Yo solo me voy a limitar a señalar el por qué te crashea el programa (segmentation fault). Este error se produce cuando intentas acceder a un área de la memoria que no está reservada para tu programa.

No sé el error exactamente pues no has puesto suficiente código, pero probablemente se esté produciendo porque no has inicializado correctamente la variable cabecera. En el constructor tendrías que haber hecho algo así:

Código
  1. Lista::Lista() {
  2.    cabecera = NULL;
  3. }


Y en la función insertar, algo así:

Código
  1. void insertar(string cadena){
  2.    Celda *puntero;
  3.    puntero = cabecera;
  4.  
  5.    if(NULL != puntero) { // Tienes que comprobar si hay datos o no
  6.        while(NULL != puntero->siguiente)
  7.            puntero = puntero->siguiente;
  8.  
  9.        puntero->siguiente = new Celda;
  10.        puntero->siguiente->siguiente = NULL; // Tienes que inicializar
  11.        puntero->sigueinte->datos = cadena;
  12.    } else {
  13.        cabecera = new Celda;
  14.        cabecera->siguiente = NULL; // Tienes que inicializar
  15.        cabecera->datos = cadena;
  16.    }
  17. }

Era exactamente eso. Muchas gracias!!!