[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