Ver Mensaje Individual
  #5 (permalink)  
Antiguo 10/09/2006, 02:05
Nivel7
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Bueno, en realidad no pense que seria complicado,

te explico.
la enun Tipo es para crear las constantes que se usaran en un if o switch para saber el tipo que estamos manejando.

tambien se puede hacer:

#define CHAR 1
#define SHORT 2
#define INT 3
#define PCHAR 4
//etc...

y la union la use para evitar crear una estructura con un miembro de cada tipo:

//usando las constantes declaradas con define
//y sin la union Data

struct Var
{
int tipo
char cdat;
short sdat;
int idat;
char* pcdat;
//etc...
};

de esta forma
la estructura Var puede contener cualquier tipo, y ademas un campo que describe el tipo contenido.

ya que en C los tipos no se describen asi mismos mas que por el tamaño en bytes en la memoria, y este no te sirbe de mucho, ya que un int es igual a todos los tipos puntero, es decir 4 bytes.

ose:

sizeof(char) es 1;
sizeof(short) es 2;
sizeof(int) es 4;
sizeof(long) puede ser 4 u 8.
y
sizeof(char*) es 4;
sizeof(void*)es 4;
sizeof(long*) es 4;

asi que te seria dificil diferenciar un int de un puntero, y peror diferenciar un tipo de puntero en particular.


pero usando la estructura con el descriptor de tipo, ya podemos saber de que tipo se trata la variable que estamos usando,
es decir si quieres crear un int ya no usarias int sino:

Var varInt = Crear(INT , 100);

para crea<r una cadena:

Var varstr = Crear(PCHAR, "Cadena");

la funcion Crear podria ser como te mencione en el mensage anterior.

//use un puntero a void, pues no hay en este caso una union
//y la funcion teiene que aceptar cualquier valor o cadena.
Var* Crear(int tipo, void* dato)
{
Var* var = malloc(sizeof(Var));
switch(tipo)
{
case PCHAR:
var->tipo = tipo;
strcpy(var->pcdat, (char*)dato;
break;
case INT:
var->tipo = tipo;
var->idat = *((int*)dato);
break;
//etc..
}
return var;
}

ejemplo;

main()
{
char elNombre[40];
int laEdad;
Var nombre ;
Var edad;

scanf("%s %i", elNombre, &laEdad);

nombre = Crear(PCHAR, elNombre);
edad = Crear(INT, la Edad);

//una vez que ya tienes las variables con su valor y tipo respectivo ya
//puedes utilizarlas segun quieras.
};

por ejemplo, pordrias crear una funcion sumar, que sume los numeros y las cadenas las concatene, y que si sumas un numero y una cadena segun la pocicion de cada openrando:
por ejemplo, si cadena esta antes que numero, numero se convierte a cadena y se concatenan, si numero esta antes que cadena, cadena se convierte a numero y se suman. etc.

Var* Sumar(Var* op1, Var* op2)
{
Var* var = malloc(sizeof(Var));
switch(op1->tipo)
{
case PCHAR:
var->tipo = op1->tipo;
strcpy(var->dato, op1->dato);
if(op2->tipo == INT)
{
strcat(var->dato, (la converion a cad de op2->dato));
}
else
{
strcat(var->dato, op2->dato);
}
break;
case INT:
var->tipo = INT;
if(op2->tipoPCHAR)
{
var->dato = op1->dato + (laconvercion a int de op2->dato);
}
else
{
var->dato = op1->dato + op2->dato;
}
break;
}
return var;
}

podrias usarla en el programa:

Var* misdatos = Sumar(nombre, edad);
el resultado seria: (nisdatos->dato) "un nombre 27";
//la inversa en este caso no se puede.

en fin podria usarse de muchas formas.

Saludos.

Última edición por Nivel7; 10/09/2006 a las 02:13