elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Duda] Unsigned int y enumeraciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Duda] Unsigned int y enumeraciones  (Leído 3,010 veces)
xRodak

Desconectado Desconectado

Mensajes: 19


Ver Perfil
[Duda] Unsigned int y enumeraciones
« en: 4 Febrero 2014, 22:27 pm »

Hola compañeros ! Me entró una duda sobre la definición de ciertas variables.

Supongamos tengo la siguiente enumeración:

namespace ENUM
{
    enum ID
    {
        a,
        b,
        c,
    };
}


Cuál sería una forma correcta de declarar un valor de dicha enumeración?

ENUM::ID       valor = ENUM::a;

o

unsigned int    valor = ENUM::a;

He visto ejemplo donde se utiliza la primera, pero según lo que he alcanzado a estudiar, la segunda sería más ideal.

Cómo sé cual de las dos debo utilizar dependiendo de cierto contexto?

Saludos y gracias de antemano.


En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: [Duda] Unsigned int y enumeraciones
« Respuesta #1 en: 5 Febrero 2014, 00:13 am »

Respondo: Según el libro Deitel&Deitel "Como programar en C/C++", una enumeración es un conjunto de constantes numéricas enteras, representadas por ciertos nombres o identificadores. O sea, una enumeración es como un arreglos de CONSTANTES. Dice además que el valor de cada constante de enumeración puede ser definido explícitamente durante su declaración. Ejemplo:

enum letras {A = 1, B = 3, C = 8};

Ahora, si son "constantes" su valor no se puede cambiar una vez declarado. Entonces ¿cómo lo vas a cambiar? Cualquier instrucción de asignación de un valor luego de la declaración de la enumeración sería ilegal. Yo creo que no puedes. De hecho, estuve probándolo y el compilador me da un error en cuanto intento asignar un valor a alguna de las constantes fuera de la declaración del enum.

Si quieres poder cambiar los valores a los campos debes usar otro tipo de dato, como un struct por ejemplo.


En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [Duda] Unsigned int y enumeraciones
« Respuesta #2 en: 5 Febrero 2014, 08:31 am »

Hola compañeros ! Me entró una duda sobre la definición de ciertas variables.

Supongamos tengo la siguiente enumeración:

namespace ENUM
{
    enum ID
    {
        a,
        b,
        c,
    };
}


Cuál sería una forma correcta de declarar un valor de dicha enumeración?

ENUM::ID       valor = ENUM::a;

o

unsigned int    valor = ENUM::a;

He visto ejemplo donde se utiliza la primera, pero según lo que he alcanzado a estudiar, la segunda sería más ideal.

Cómo sé cual de las dos debo utilizar dependiendo de cierto contexto?

Saludos y gracias de antemano.

Salvo que se indique otra cosa, los enumerados son por defecto ints.

En realidad el compilador va a convertir tus enums en ints... pero con algunas restricciones relativas al uso de operadores:

Código
  1. // esta linea provoca un warning
  2. ENUM::ID valor = ENUM::a | ENUM::b;
  3.  
  4. // mientras que esta otra linea no
  5. int valor = ENUM::a | ENUM::b;

La ventaja de usar ENUM::ID en vez de int es que el que vaya a usar tus funciones / clases sabrá en todo momento cual es el rango válido de valores... ya que vienen definidos por el enumerado.

A partir de la versión 11 de C++ se puede especificar un tipo concreto para el enum:

Código
  1. enum ENUM : unsigned long { a, b, c, maximo = 0xFFFFFFFFU }


Ahora, si son "constantes" su valor no se puede cambiar una vez declarado. Entonces ¿cómo lo vas a cambiar? Cualquier instrucción de asignación de un valor luego de la declaración de la enumeración sería ilegal. Yo creo que no puedes. De hecho, estuve probándolo y el compilador me da un error en cuanto intento asignar un valor a alguna de las constantes fuera de la declaración del enum.

Estás mezclando conceptos.

Que los valores del enumerado sean constantes quiere decir que no puedes redefinir sus valores, es decir, la siguiente línea da un error de compilación:

Código
  1. ENUM::a = 78

Sin embargo, nada te impide almacenar el valor en una variable y manipularlo a tu antojo. La relación que se va a mantener constante durante toda la ejecución del programa es que ENUM::a siempre va a tener el mismo valor.

Si quieres poder cambiar los valores a los campos debes usar otro tipo de dato, como un struct por ejemplo.

Sigues mezclando conceptos. Las estructuras es un tipo que permite crear estructuras ( valga la redundancia ) complejas de datos, por ejemplo te permite agrupar el puntero a un vector y la variable que indica el número de elementos en dicho vector para que siempre vayan juntos:

Código
  1. struct Vector
  2. {
  3.  int* puntero;
  4.  int size;
  5. };

Realmente, como he comentado antes, solo necesitas almacenar el valor del enumerado en una variable de tipo numérico ( si no es del mismo tipo que el predefinido para el enum puede que tengas que hacer un casting ) y después puedes manipular la variable a tu antojo... eso si, no hay impedimentos para que esa variable forme parte de una estructura, una clase o una unión.
En línea

xRodak

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [Duda] Unsigned int y enumeraciones
« Respuesta #3 en: 5 Febrero 2014, 18:20 pm »

Gracias por tu respuesta eferion ! Yo pensaba que la enumeración era algo más que un simple int (suponiendo que se utilizan como ints). Por eso pensaba que existía alguna diferencia considerable entre utilizar ambas definiciones. Ahora veo que definir una variable como entero es más adecuado.

Muchas gracias !

Y yoel, de verdad confundiste mi pregunta xD.

Saludos !
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: [Duda] Unsigned int y enumeraciones
« Respuesta #4 en: 6 Febrero 2014, 00:14 am »

Insisto, los enum son agrupaciones de constantes, lo cual significa que una vez declares su valor, NO lo puedes cambiar. Por ejemplo, sea:

Código:
enum {A=3, B, C};

Ya está definido el valor constante de A = 3. Si luego intentas poner por ejemplo:

Código:
A = 5
el compilador arroja un error, en mi caso el compilador gcc de GNU que es acorde a la especificación oficial ISO/IEC 9899:1999, conocida como C99:
Código:
test1.c: In function ‘main’:
test1.c:18: error: lvalue required as left operand of assignment
es decir, que A no es un "lvalue", su valor no se puede cambiar. Así que no la "puedes manipular a tu antojo". Lo que sí puedes es asignar su valor a una variable, algo como
Código:
int x;
x = A;

Recuerden que cuando declaras un identificador constante muchos compiladores (si respetan el estándar) intentarán ubicarlo en una zona de memoria donde su valor no pueda ser modificado.

Ahora, otra cosa es que estés usando algún compilador "flexible" que soporte funcionalidades no estándares, lo cual alienta a prácticas inadecuadas de programación que no serán compatibles con otras plataformas. ¿Sería este el caso?
« Última modificación: 6 Febrero 2014, 00:58 am por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [Duda] Unsigned int y enumeraciones
« Respuesta #5 en: 6 Febrero 2014, 02:20 am »

el compilador arroja un error, en mi caso el compilador gcc de GNU que es acorde a la especificación oficial ISO/IEC 9899:1999, conocida como C99
Lo primero a considerar es el lenguaje de programación utilizado: este es C++ y por ende hay que compilar en modo C++98 o C++11.

Insisto, los enum son agrupaciones de constantes, lo cual significa que una vez declares su valor, NO lo puedes cambiar.
Me parece que aquí hay una confusión ya que eferion se refiere a modificar una variable de tipo "enum T" y, por supuesto, es correcto.

Por cierto una pagina donde se listan algunas diferencias entre las enumeraciones en C++98 y C++11 es Better types in C++11 - nullptr, enum classes (strongly typed enumerations) and cstdint.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[DirectX8] APIS, Estructuras, constantes, Enumeraciones.....
Programación Visual Basic
BlackZeroX 6 3,136 Último mensaje 28 Octubre 2010, 01:47 am
por raul338
Unsigned int en java?
Java
danielo- 4 4,753 Último mensaje 5 Septiembre 2011, 05:50 am
por [Case]
[Duda] Las enumeraciones (Enum) (Solucionado)
.NET (C#, VB.NET, ASP)
Senior++ 3 4,050 Último mensaje 2 Enero 2012, 13:11 pm
por Senior++
[duda] ¿Unsigned int de 64 bits?
Programación C/C++
oxydec 2 2,047 Último mensaje 29 Octubre 2012, 02:23 am
por rir3760
unsigned int 8 , unsigned int 8 y demas [DUDA] « 1 2 »
Programación C/C++
bash 10 4,643 Último mensaje 9 Abril 2015, 20:08 pm
por bash
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines