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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


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

Desconectado Desconectado

Mensajes: 78


Ver Perfil
Error creando lista C++
« en: 18 Diciembre 2013, 00:47 am »

Tengo un error a la hora de intentar acceder a un elemento de una lista en c++ y no se por que es, a ver si alguien me puede echar un cable please!
Pd: Solo tengo implementado para crear un nodo.

Código
  1. typedef struct tNodo {
  2.    int num;
  3.    tNodo *sig;
  4. };
  5. void insertar(tNodo *cab, int dato) {
  6.    if (cab == NULL) {
  7.        cab = new tNodo;
  8.        cab->num = dato;
  9.    }
  10. }
  11. int main()
  12. {
  13.    tNodo *cabecera = NULL;
  14.    insertar(cabecera, 2);
  15.    cout << cabecera->num << endl; //Aqui me peta
  16.  
  17.    return 0;
  18. }
  19.  


En línea

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Error creando lista C++
« Respuesta #1 en: 18 Diciembre 2013, 01:37 am »

ummm creo que cometes unos errores, en primera no incluyes las librerias para correr el código, en segunda no usas el estandar std para el uso de entrada y salida.

en fin, te dejo el código y te explico lo que yo entiendo, pues mis concepto técnico aún lo estoy puliendo respecto a C++/C, pues siempre es complejo pero muy enriquecedor e interesante.

Código
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5.  
  6. struct tNodo {
  7.    int num;
  8.    tNodo *sig;
  9. };
  10.  
  11. void insertar(tNodo *cab, int dato) {
  12.    cab->num = dato;
  13. }
  14.  
  15. int main()
  16. {
  17.    tNodo cabecera;
  18.    memset(&cabecera, 0, sizeof(cabecera)); // En estructura no es posible instanciar, se usa asignación dinamica de memoria
  19.    tNodo *p_cabecera;
  20.  
  21.    p_cabecera = &cabecera;
  22.    insertar(p_cabecera, 2);
  23.    //p_cabecera->num = 30;
  24.    cout << p_cabecera->num << endl; //Aqui me peta
  25.    return 0;
  26. }
  27.  

Mira lo primero que debes hacer es usar las librerias y el estandar de reserva de nombres, es decir, el namespace std. Por eso es que no te correo el cout.

Ahora respecto a los apuntadores a la estructura cabecera, no debes usarlo directamente, debes crear un apuntador que apunte (ya se ya se, valga la rebundancia) hacia la dirección de memoria creada por la estructura incial cabecera

Citar
tNodo cabecera;
 tNodo *p_cabecera;
 p_cabecera = &cabecera;

Así ya puedes usar el apuntador de la manera que te plazca sin errores de segmentación, pues lo que sucedia, o como lo veo, es que no habia memoria reservada para esa estructura, y por eso no era posible insertar ni imprimir datos, pues simplemente no habia nada en donde escribir la información.

Ahora lo que tu haces con NULL y eso, no es posible hacerlo con estructuras, como yo lo veo, leyendo por ahi, es que las estructuras no se comportan de la misma manera como las clases, pues aunque en c++ sean estimadas como clases con propiedades de caracter publico (quiero decir, que sus atributos siempre serán publicos por defecto, al contrario de crear una clase, que como se respete con un objeto sus atributos serán siempre privados por defecto), eso es digamos la versión corta, creo que alguien más puede extender un poco porque me interesa el saber esto también.


Código:
memset(&cabecera, 0, sizeof(cabecera));

Es por ello que lo que debe hacerse es reservar memoria dinamica del tamaño de la estructura para determinar que no hay nada ahí, o algo así, no se como podría explicarlo mejor, es como para hacerlo, necesitas de malloc o de memset (biblioteca cstring en C++ o string.h en C) de un tamaño determinado y luego le indicas que es vacio, pero es un vacio del tamaño de la estructura que tienes.

http://stackoverflow.com/questions/2022425/comparing-structs-to-null
http://stackoverflow.com/questions/6891720/initialize-reset-struct-to-zero-null

Bueno creo que eso seria todo, suerte con tu trabajo.

PD: estamos hablando de estructuras (struct) no de listas (list) son cosas completamente diferentes.  :silbar: :silbar:


En línea


rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Error creando lista C++
« Respuesta #2 en: 18 Diciembre 2013, 02:36 am »

Tengo un error a la hora de intentar acceder a un elemento de una lista en c++
Hay dos errores en el programa.

El primero es el uso de typedef, en C++ no es necesario (con usar la etiqueta basta) y su forma no es la correcta, en C (donde si es necesario) seria así:
Código
  1. typedef struct nodo {
  2.   int num;
  3.   struct nodo* sig;
  4. } tNodo;

El segundo y mas importante: el argumento de la función "insertar" se pasa por valor y el parámetro "cab" es una variable local (única) a la función, puedes hacer lo que quieras con ella sin afectar el valor de la variable "cabecera" de la función main.

Para solucionarlo solo debes cambiar la declaración y definición de la funcion "insertar" para indicar el uso de una referencia:
Código
  1. #include <iostream>
  2. using namespace::std;
  3.  
  4. struct tNodo {
  5.   int num;
  6.   tNodo* sig;
  7. } ;
  8.  
  9. void insertar(tNodo*& cab, int dato);
  10.  
  11. int main()
  12. {
  13.   tNodo* cabecera = 0; // En C++ lo politicamente correcto es 0
  14.   insertar(cabecera, 2);
  15.   cout << cabecera->num << endl;
  16.   delete cabecera;
  17.  
  18.   return 0;
  19. }
  20.  
  21. void insertar(tNodo*& cab, int dato)
  22. {
  23.   if (cab == 0){
  24.      cab = new tNodo;
  25.      cab->num = dato;
  26.   }
  27. }

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
d00ze13

Desconectado Desconectado

Mensajes: 78


Ver Perfil
Re: Error creando lista C++
« Respuesta #3 en: 18 Diciembre 2013, 11:41 am »

Muchas gracias a los dos por las explicaciones tan buenas! me ha quedado muy claro!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
error-> Lista de contactos no esta disponible (error:80072edf)
Mensajería
Odyssea 2 23,330 Último mensaje 20 Noviembre 2010, 01:59 am
por quirion
Existe una lista de los numero de error de Vb6.0
Programación Visual Basic
hunter18 1 4,190 Último mensaje 15 Diciembre 2010, 22:51 pm
por ssccaann43 ©
Error rarisimo creando thumbnail
PHP
PanConMantequilla 2 3,962 Último mensaje 21 Julio 2011, 09:03 am
por PanConMantequilla
Error creando Thread (CreateThread)
Programación C/C++
CeroX901 7 3,779 Último mensaje 18 Octubre 2011, 01:03 am
por CeroX901
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines