[C con Clase] Ayuda sobre estructuras, como defino un puntero?

D1e6o! diegogeid en gmail.com
Mar Sep 18 07:49:36 CEST 2007


Muchas gracias Steven!
Me aclara muchas dudas como esperas, pero hay otras que me surgieron, te las
comento.

(int *) uno->obj1 = (int *) malloc( sizeof(int) );

Porque necesito indicar que es un puntero con el primer int* si lo hice
anteriormente o es optativo?

Y por otro lado, es necesario decirle al compilador que voy a usar uno u
otro tipo de datos? Como son punteros, no es lo mismo no convertir tipos en
este caso? (simplificaría mucho las cosas aunque no creo que sea posible
pero pregunto por las dudas)

Muchas gracias por todo! Saludos!

El día 17/09/07, Steven Richard Davidson <stevenrichard.davidson en gmail.com>
escribió:
>
> Hola Diego,
>
> On 9/17/07, D1e6o! <diegogeid en gmail.com> wrote:
> > Hola gente, ando con un problema con estructuras:
> >
> > Quería asignar una lista pero l cual puede contener distintos de
> objetivo en
> > su enlace como ven:
> >
>
> [CORTE]
>
> > Lo que quisiera es lograr apuntar por uno a una variable del tipo
> tipoent,
> > tipootro o del mismo tipoobj o otros tipos que defina mas adelante sin
> > problemas... e incluso hasta a una variable del tipo
> > char, supongo que no hay problemas con
> > esto por ocupar un puntero lo mismo para
> > cualquier tipo pero.. como? Alguien tiene un ayudita?
> >
>
> Si estás usando C y no C++, entonces vas por buen camino. Lo que debes
> hacer es aplicar cástings al tipo "correcto" cada vez que quieras usar
> el puntero. Usando to ejemplo, haríamos lo siguiente:
>
>
> int main()
> {
>   tipoent suma;
>   tipoobj *uno;
>
>   uno = (tipoobj *) malloc( sizeof(tipoobj) );
>
>   uno->operac = '+';
>   (tipoent *) uno->obj1 = (tipoent *) malloc( sizeof(tipoent) );
>   uno->obj2 = NULL;
>
>   ((tipoent *) uno->obj1)->num1 = 10;
>   ((tipoent *) uno->obj1)->num2 = 20;
>
>   suma = ((tipoent *) uno->obj1)->num1 + ((tipoent *) uno->obj1)->num2;
>
>   printf( "%d + %d = %d", ((tipoent *) uno->obj1)->num1, ((tipoent *)
> uno->obj1)->num2, suma );
>
>   return 0;
> }
>
>
> Es algo engorroso, porque tienes que estar haciendo cástings para
> cualquier operación que quieras hacer. Además, si no sabes el tipo
> "correcto", entonces vas a tener que comprobar el "tipo", seguramente
> con un 'switch/case'. Por ejemplo,
>
> uno = (tipoobj *) malloc( sizeof(tipoobj) );
>
> scanf( "%c", &operacion );
>
> switch( operacion )
> {
>   case '+':
>     uno->operac = '+';
>     (int *) uno->obj1 = (int *) malloc( sizeof(int) );
>     (int *) uno->obj2 = (int *) malloc( sizeof(int) );
>   break;
>
>   case '-':
>     uno->operac = '-';
>     (int *) uno->obj1 = (int *) malloc( sizeof(int) );
>     (int *) uno->obj2 = (int *) malloc( sizeof(int) );
>   break;
>
>   case '*':
>     uno->operac = '*';
>     (int *) uno->obj1 = (int *) malloc( sizeof(int) );
>     (int *) uno->obj2 = (int *) malloc( sizeof(int) );
>   break;
> }
>
> Para poder manipular los parámetros, haríamos algo parecido a lo
> siguiente:
>
> scanf( "%d %d", &((int *) uno->obj1)->num1, &((int *) uno->obj1)->num2 );
>
>
> En cuanto a la definición de la estructura 'tipoobj', puedes usar
> 'void *' o incluso 'char *'. La verdad es que da igual que tipo de
> puntero escojas, porque siempre vas a aplicar un cásting. Esto sería,
>
> typedef struct objeto
> {
>   char tipo;
>   void *obj1;
>   void *obj2;
> } tipoobj;
>
>
> Espero que esto te aclare las dudas.
>
> 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/20070918/a79e346f/attachment.html>


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