[C con Clase] Estructuras y punteros

Angel Adrián Carrillo Comparán squall_oggy en hotmail.com
Mar Feb 24 22:44:44 CET 2009


Muchas gracias Steven, tu siempre me sacas de dudas con los punteros =P









Usar direcciones de Internet con nombres es para niñitas.

Los verdaderos hombres memorizan las IPs de los sitios a los

que quieren acceder para evitar tener que pasar por el DNS....

 

Atte. Adrian (Oropher)



Mi Blog: http://www.oropher.com.mx/












> Date: Tue, 24 Feb 2009 15:35:54 -0500
> From: srd4121 en njit.edu
> To: cconclase en listas.conclase.net
> Subject: Re: [C con Clase] Estructuras y punteros
> 
> Hola Ángel,
> 
> Angel Adrián Carrillo Comparán wrote:
> > Tengo un problema con unos punteros, cuando mandoa  llamar la funcion
> > de Leer(Cilindro &RefCil) esta manda a llamar a Leer(Circulo &RefC) 
> > pasandole como parametro el puntero Circulo  de la estructura de 
> > Cilindro y esta funsion a su ves llama a Leer(Punto &RefP) pasandole
> >  como parametro el puntero Punto de la estructura de Circulo.
> > 
> 
> Quiero aclarar que estos parámetros no son punteros sino referencias. Lo 
> que sí es cierto es que en tu diseño, estas referencias contienen punteros.
> 
> > El problema es que al leer los valores de punto y regresar a 
> > Leer(Circulo &RefC) los valores de punto se mantienen, pero al
> > regresar a Leer(Cilindro &RefCil) los valores que tenia la estructura
> > de Punto ya no contienen valores, les pongo el programa que estoy
> > realizando, de ante mano muchas gracias!!!!
> > 
> 
> Esto es porque los punteros miembros de estas estructuras apuntan a 
> variables locales, las cuales son destruidas nada más terminar su 
> ámbito, que en estos casos es al terminar la función.
> 
> Veamos el código fuente.
> 
> > #include <iostream>                 //Para cout y cin
> > #include <conio.h>                 //Para getch()  y clrscr() ó ystem 
> > ("cls")
> > #include <iomanip>                 //Para setfill() y setw()
> > #include <stdio.h>                 //Para gets()
> > #include <math.h>                //Para M_PI
> > 
> 
> Sugiero usar los nombres recientes: <cstdio> y <cmath>.
> 
> [CORTE]
> 
> > int main (void)
> >     {
> >         //clrscr();
> >         system ("cls");
> >         Cilindro Cil;
> >         Leer (Cil);
> >         cout << Cil.AptC->AptP->coordx << Cil.AptC->AptP->coordy;
> >                 
> >         cout.setf (ios::fixed);
> >         cout.setf (ios::showpoint);
> >         cout.precision (2);
> >                 
> >         Imprimir (Cil);
> >         getch();
> >         return 0;
> >     }                           //fin de main ()
> >        
> > void Leer (Punto &RefP)
> >     {
> >         cout << "\tDATOS DEL PUNTO\n"
> >              << "\tIngresa la coordenada de X: ";
> >         cin  >> RefP.coordx;
> >         cout << "\tIngresa la coordenada de Y: ";
> >         cin  >> RefP.coordy;
> >         cout << endl;
> >     }                            //fin de leer ()
> >      
> > void Imprimir (Punto &RefP)
> 
> Sugiero anteponer 'const' a este parámetro, ya que no tienes intención 
> de modificar su contenido.
> 
> >     {
> >         cout << "\tLas coordenadas del punto son: ["
> >              << RefP.coordx << "," << RefP.coordy << "]" << endl << endl;
> >     }                               //fin de imprimir ()
> >      
> > void Leer (Circulo &RefC)
> >     {
> >         Punto P;
> >         RefC.AptP=&P;
> 
> Esto es un problema. El miembro 'AptP' apunta a una variable local 'P'. 
> Esto significa que al terminar de ejecutar 'Leer()', la variable 'P' es 
> destruida y por tanto el miembro 'AptP' apunta a "basura".
> 
> >         Leer (P);
> >         //cout << P.coordx << P.coordy;
> >         cout <<"***" <<  RefC.AptP->coordx << RefC.AptP->coordy;
> >         cout <<"***" <<  P.coordx << P.coordy;
> >         cout << "\tDATOS DEL CIRCULO\n"
> >              << "\tIngresa el radio del circulo : " ;
> >         cin  >> RefC.Radio;
> >     }                               //fin de leer()
> >        
> 
> Las funciones restantes parecidas a 'Leer()' tienen el mismo problema. 
> La solución es usar memoria creada dinámicamente. Esto supone que tienes 
> que liberar tal memoria al final del programa.
> 
> 
> 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

_________________________________________________________________
Personaliza Messenger como tú quieras.
http://download.live.com/messenger
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090224/f875a128/attachment.html>


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