[C con Clase] cout no imprime lo mismo cuando uso estructuras.

Miguel Eduardo Román Martínez miguelerm en gmail.com
Vie Abr 29 19:50:12 CEST 2011


Excelente, esto aclara mi duda, muchas gracias.

Saludos.

2011/4/29 Steven Davidson <srd4121 en njit.edu>

> 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
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20110429/fae85ac3/attachment.html>


Más información sobre la lista de distribución Cconclase