C/Visual C - NO ENTIENDO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 
Vista:

NO ENTIENDO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Publicado por JOSE (1 intervención) el 12/10/2007 16:46:34
Que tal entcontre esto .... en internet ... y la verdad no lo entiiendo... me podria alguien explicar que es "enum" "union", y pq hay un puntero en los char.
que libreria nesesito para que acepte enum y union...
Gracias

tipo_x hoja[26][10]

hoja[tolower(celda[0]) - 'a'][celda[1] - '0'] = 123;

Código:
#define NUM_FILAS 26
#define NUM_COLS 10

enum tipo_de_celda {
ETIQUETA,
LITERAL_ENTERA,
LITERAL_FLOTANTE,
EXPRESION
};

struct celda {
enum tipo_de_celda tipo;

union {
char *etiqueta;
int entero;
double doble_prec;
char *expresion;
}dato;
};

/* ... */

struct celda hoja[NUM_FILAS][NUM_COLS];

/* ... */
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:NO ENTIENDO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Publicado por fernando.gomez (1603 intervenciones) el 12/10/2007 17:10:21
No necesitas librerías, son parte del lenguaje. Un enum es una enumeración. Por ejemplo, de días de la semana:

int diasemana = 1;

lo anterior no se ve tan bien, ¿verdad? ¿"diasemana" tiene asignado el valor lunes or martes? Mejor nos creamos una enumeración:

enum DiaSemana
{
Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo
};

DiaSemana diasemana = Lunes;

Mejor, ¿no? En esencia, una enumeración le asigna un valor entero a cada literal. Es decir, si revisas el valor de "diasemana" verás que este contiene un número: 1. La idea de la enumeración es precísamente reemplazar números con literales legibles. Además, en sí mismo DiaSemana es un tipo de dato.

Una unión, por otra parte, es también una agrupación de datos, pero cuyos miembros comparten el mismo espacio de memoria. Por ejemplo:

union Edad
{
char sz[10];
int i;
float f;
};

enum TipoEdad
{
Numero, Decimal, Texto
};

void imprime_edad(TipoEdad tipo, union Edad edad)
{
switch (tipo)
{
case Numero:
cout << "La edad es un entero, y su valor es: " << edad.i << endl;
break;

case Decimal:
cout << "La edad es un decimal, y su valor es: " << edad.f << endl;
break;

case Texto:
cout << "La edad es cadena de texto, y su valor es: " << edad.sz << endl;
break;
}
}

int main ()
{
union Edad edad;

edad.i = 24;
imprime_edad(Numero, edad);

edad.f = 24.8;
imprime_edad(Decimal, edad);

strcpy(edad.sz, "24");
imprime_edad(Texto, edad);

return EXIT_SUCCESS;
}

Las uniones se emplearon mucho en C porque era una forma de tener polimorfismo de funciones (o sea, una sobrecarga del tipo de parámetro). En C++ esto ya queda un poco obsoleto, porque ya tenemos todas las ventajas del polimorfismo.

Ahora, por supuesto que nuestro ejemplo también se podría haber solucionado con un struct, pero a diferencia de éste, la unión no gasta tanta memoria como el struct (cuyo tamaño es igual a la suma del tamaño de todos sus miembros, mientras que de la unión, al compartir bloque de memoria, el tamaño de ésta será igual al tamaño de la variable más grande; en nuestro ejemplo anterior dicha variable es sz[10] que ocupa 10 bytes, por lo que el tamaño de la unión será de 10 bytes).

Ahora, siempre hay que tener en cuenta qué variable es a la que se le asignó valor. Hacer algo como:

edad.sz[0] = 'A';
cout << edad.i << endl;

muy posiblemente te imprimirá el valor 65, pero usualmente no tendrá sentido el valor dado que la representación de los bytes es diferente.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar