Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Campos de Bits y estructuras

Estas en el tema de Campos de Bits y estructuras en el foro de C/C++ en Foros del Web. Tengo una duda. Tengo una estructura como campos de bits, pero puedo meter otra estructura de campos de bits(anidarla)? struct { unsigned a:8;//Define un campo ...
  #1 (permalink)  
Antiguo 26/04/2006, 15:41
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Campos de Bits y estructuras

Tengo una duda.
Tengo una estructura como campos de bits, pero puedo meter otra estructura de campos de bits(anidarla)?

struct {
unsigned a:8;//Define un campo de 8 bits
struct {
unsigned z:1;
unsigned c:1;
}f;
}*af;

Ese es el punto, es posible, que me respete mis espacios? es decir, que si yo hago por ejemplo¨:
*af=0xFCFD me ponga en f 0xFD y en a 0xFc?

Saludos
  #2 (permalink)  
Antiguo 28/04/2006, 00:13
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 19 años, 5 meses
Puntos: 24
Se puede pero seria algo asi creo:

struct A {
unsigned z:1;
unsigned c:1;
A *af:8
}f;

struct B {
unsigned a:8;
};
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #3 (permalink)  
Antiguo 28/04/2006, 10:17
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Hum, si puedes usar otra cosa que no sean campos de bits, te lo recomendaría O.o Es una de las cosas poco portables.
  #4 (permalink)  
Antiguo 28/04/2006, 10:39
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 19 años, 5 meses
Puntos: 24
por que es poco portable?, si esta definido en el estandart. o NO
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #5 (permalink)  
Antiguo 28/04/2006, 14:40
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Lo mismo pregunto,porque no es probable si incluso es parte del lenguaje C.
Esta dentro de lo estandar y tengo varios documentos que lo prueban.
De todas maberas, estoy modificando las ideas y usando C++ para representar los registros como objetos.
Esto de la POO cada dia se pone mas interesante.
Saludos
  #6 (permalink)  
Antiguo 28/04/2006, 16:56
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
No hace falta que pruebes nada, lo sé.

Pero vamos a ver, un "char", un "int", un "loquesea", no lo define el estándar, nunca sabes qué tamaño van a tener o qué espacio van a ocupar realmente. es decisión del compilador.

Así mismo, las estructuras de bits son aún más extrañas, y si se puede usar otro método, es mejor que jugar a ese nivel.

Pero vamos, a tu juicio.
  #7 (permalink)  
Antiguo 28/04/2006, 17:16
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Bueno, en ese punto tienes razon, por eso es que ahora uso objectos.y no uso int o char, generalmente uso los Uint8 y cosas asi y en el ultimo casounsigned char para bytes y unsigned short para words.

Saludos
  #8 (permalink)  
Antiguo 29/04/2006, 00:48
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 23 años
Puntos: 7
Yo utilizo todo el tiempo campos de bits, para microcontroladores, y en mi experiencia, son poco portables y según sé, el orden de almacenamiento no está definido en un estándar (corríjanme si me equivoco).
Normalmente, en los compiladores que he usado, siempre debo definir en que orden se acomodarán los bits. Cuando se trata de variables que sólo yo utilizo en el programa no hay problema y de hecho, en esos casos sí los utilizo, pero cuando se trata de bitfields relacionados con algún puerto del microcontrolador, o flags de configuracion, u otras variables utilizadas por mi circuito, no verificar esto, resulta fatídico.
Cita:
si puedes usar otra cosa que no sean campos de bits, te lo recomendaría
En ese sentido coincido con MaxExtreme. Por lo menos para las operaciones donde la portabilidad o la dependencia con el hardware son un problema, en mi opinión es preferible utilizar bitmasks y operaciones binarias que bitfields.
  #9 (permalink)  
Antiguo 29/04/2006, 07:57
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Claro, o simplemente como le dije en otro post, crear una clase "quizás-no-portable" que represente los campos de bits, y luego, cada plataforma que la implemente como pueda, tanto con campos de bits, como con variables a pelo.

C es universal, sí, pero no significa que sea portable en todos los aspectos. Por ejemplo:

Otra cosa que me cabreó hace años al leer a mano imágenes, la función estándar fread() para leer bloques de información, como por ejemplo un array de structs, depende del mínimo de alineación de memoria asignado. Es decir, VC++6 por defecto ponía 4 bytes, declarases la variable que declarases, pero si en la struct tenías un short, o un char, ya la había tramado. Total, o lo hacías a mano, o reducías el mínimo a 1 byte, cosa poco recomandable.

¿Portable? Pues la función fread() lo es, al igual que los campos de bits, pero su funcionamiento puede variar inesperadamente.

Última edición por MaxExtreme; 29/04/2006 a las 08:02
  #10 (permalink)  
Antiguo 29/04/2006, 10:06
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Ok. Agradesco su respuesta. Despues de varios experimentos con los campos de bits, prefiero usar mejor variables separadas. Aparte de que es ms portable.
Aun asi tengo una duda con las eficiencia, pero eso en otro post, chequenlo.

Saludos
  #11 (permalink)  
Antiguo 29/04/2006, 11:13
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 23 años
Puntos: 7
Sobre la eficiencia, no creo que debas preocuparte. En los distintos procesadores que he utilizado, el código generado por bitfields suele ser casi el mismo que utilizarías con bitmasks y operaciones binarias. Digo casi, porque esto es dependiente del compilador, y en algunos casos, el código generado por bitfields era mediocre. La única ventaja que veo en utilizarlos, es que te permite expresar algunas operaciones que de otra manera resultarían un poco complicadas con operaciones binarias.

Por hacer un ejemplo rápido:
Código:
//con bitfields
struct{
    unsigned    a:3;
    signed        b:4;
    unsigned    c:1;
}abc;

abc.b = -7;
abc.b = ~abc.b;

//sin bitfields
unsigned char abc;
abc = (-7 << 3) & 0x78;
abc = ~abc | (abc & ~0x78);
  #12 (permalink)  
Antiguo 29/04/2006, 12:17
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Es masoemons como el segundo ejemplo. ASi lo estoy usando ahora.
Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:20.