2016-07-08 1 views
-2

Je suis en train de créer un tableau qui, à chaque indice i ont un champ de bits j'ai essayé ce code:créer une matrice de int qui est un champ de bits

struct bitF { 
    unsigned int x1:1; 
      ... 
    unsigned int xn:1; 
}intBF; 
typedef struct intBF *arr[]; 
int main(){ 
int i; 
unsigned int *arr2[10] 
for(i=0;i<sizeof(arr2)/sizeof(unsigned int);i++) 
{ arr2[i] = malloc(sizeof(intBF)); 
    arr2[i] = (unsigned int *)(&intBF); 
    arr[i].x5 = 3;} 
return 0;} 

mais j'obtiens l'erreur du compilateur pour la dernière ligne de code. Je veux pouvoir aller au tableau à l'index 'n' et changer les valeurs de bits (sans utiliser de masques). l'erreur du compilateur (bien que je ne pense pas qu'il est pertinent) est:

error: expected identifier or '(' before '[' token

+0

Si vous obtenez une erreur de votre compilateur, vous devez copier/coller cette erreur dans votre question, afin que les autres puissent vous aider. Vous avez également un '_' dans votre avant-dernière ligne, ce qui n'est pas une syntaxe correcte. – nos

+0

Eh bien, vous codez n'a pas beaucoup de sens en effet et est mal formaté. Et un bitfield -struct n'est certainement pas une bonne idée si vous voulez adresser des bits simples. En règle générale, ne jamais lancer si vous ne connaissez pas vraiment toutes ses implications, les accepter et (le plus important) vraiment le faire. Voir aussi [demander]. Re l'erreur du compilateur: Je suppose que le compilateur sait mieux ce qui est pertinent et ce qui ne l'est pas. Il devrait vous dire quelque chose que le compilateur est certain que votre code est faux. – Olaf

+0

* l'erreur du compilateur (bien que je ne pense pas que ce soit pertinent) * Les erreurs du compilateur sont ** toujours ** pertinentes. Tous. – dbush

Répondre

0

J'ai trouvé la solution par essai et erreur :))),

#define SIZE 5 
struct bitF { 
    unsigned int x1:2; 
     ... 
    unsigned int xn:2; 
}intbf[SIZE]; 
main() 
{ 
    int i; 
    unsigned int *p[SIZE]; 
    for(i=0;i<SIZE;i++) 
    { 
     p[i] = malloc(sizeof(intbf[i])); 
     p[i] = (unsigned int *)(&intbf[i]); 
    } 
    intbf[0].x2 = 3; 
    for(i=0;i<SIZE;i++) 
     printf("%d\n",*p[i]); 
    return 0; 
} 

et moi avons la sortie:

12 
0 
0 
0 
0 
1

solution plus élégante:

#define SIZE 5 
typedef struct { 
    unsigned int x1:2; 
     ... 
    unsigned int xn:2; 
}TYPE; 
main() 
{ 
    int i; 
    unsigned int *p; 
    TYPE *arrType = malloc(sizeof(TYPE)*SIZE); 
    arrType[0].x2 = 1; 
    arrType[1].x2 = 2; 
    arrType[2].x2 = 3; 
    for(i=0;i<SIZE;i++) 
    { 
     p = (unsigned int *)(&arrType[i]); 
     printf("%d\n",*p); 
    } 
    free(arrType); 
    return 0; 
} 

et la sortie (comme prévu) est:

4 
8 
12 
0 
0 
+0

Si je comprends bien, alors que la somme de [x1 +. .. + xn] size (dans mon cas [2 + ... + 2]) est inférieur à la taille des bits d'un entier non signé, vous obtiendrez un seul entier, sinon vous obtiendrez plus d'un entier, et le ** p ** est un pointeur vers le premier entier dans la structure. –