[C con Clase] Ayuda sobre estructuras, como defino un puntero?
Steven Richard Davidson
stevenrichard.davidson en gmail.com
Mar Sep 18 03:22:46 CEST 2007
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
Más información sobre la lista de distribución Cconclase