[C con Clase] cout no imprime lo mismo cuando uso estructuras.
Steven Davidson
srd4121 en njit.edu
Vie Abr 29 08:33:18 CEST 2011
Hola Miguel,
On 4/29/2011 2:10 AM, Miguel Eduardo Román Martínez wrote:
> Buena noche compañeros, estoy haciendo unos ejemplos de estructuras y
> me sucedió algo curioso:
>
> y es que tengo un codigo algo como esto:
>
> cout << "Ultimo valor ingresado: " << ultimoNodo->valor << endl;
> //imprime el valor que ingreso
> cout << "Desea ingresar otro numero? (s, n) ";
> cin >> respuesta;
> cout << "Otra vez el ultimo valor ingresado: " << ultimoNodo->valor <<
> endl; //imprime la direccion de memoria.
>
> Como veran en el comentario el primer cout muesta el valor correcto
> pero el segundo muestra otro valor, a pesar de que la instruccion es
> exactamente la misma.
>
> Adjunto el codigo fuente completo por si lo quieren analizar.
>
> Seria excelente si alguien me pudiera ayudar a resolver este curioso
> fenomeno :)
>
> de ante mano muchas gracias.
>
El error está en el uso del puntero 'ultimoNodo' en la función 'push()'.
Escribes:
void push( int nuevoValor )
{
Nodo nuevoNodo = Nodo(); // No es necesario escribir: = Nodo()
nuevoNodo.valor = nuevoValor;
if( isEmpthy() )
nuevoNodo.anterior = NULL;
else
nuevoNodo.anterior = ultimoNodo;
ultimoNodo = &nuevoNodo; // Error lógico
}
La variable 'nuevoNodo' existe localmente. Esto significa que se creará
automáticamente al invocar esta función 'push()' y se destruirá
automáticamente al terminar esta función y retornar a su punto de
invocación.
Esto implica que 'ultimoNodo' apunta a "basura". Has tenido suerte que
tu programa haya podido ejecutar sin problemas, aunque has descubierto
que hay un problema con el valor accedido. Típicamente, un puntero que
apunta a basura termina por acceder a memoria que no es suya y provoca
un error en tiempo de ejecución con un mensaje al estilo de "violación
de segmentación" o "acceso denegado".
Lo que estás intentando hacer es crear una lista enlazada, pero
necesitas que sea dinámicamente enlazada. Esto significa que necesitas
usar memoria dinámica. Puedes consultar nuestro curso de EDD en nuestra
página. Puedes ir directamente a: http://c.conclase.net/edd/index.php
Espero que esto te aclare la duda.
Steven
Más información sobre la lista de distribución Cconclase