2016-12-13 2 views
-5

J'ai besoin de définir de nouveaux types de données dans mon projet, afin d'effacer et de raccourcir mon code, car il me faudra beaucoup utiliser ces types. Je sais que je dois utiliser typedef et union mais je ne m'en souviens pas très bien.Définition de nouveaux types de données dans C

Un exemple:

variable name: dUnit, 
length: 3 bytes, 
Subdivided into... 
bType->4 MSB, 
bAmount->20 LSB 

serait quelque chose comme ...

typedef struct dUnit 
{ 
    int bType: 4; 
    int bAmount: 20; 
}dUnit; 

Un autre exemple:

Variable name: dAddressType, 
length: 3 bytes, 
Not subdivided. 

typedef unsigned char dAddressType[3]; 

Je ne l'ai pas utilisé C pendant un certain temps, et maintenant Je me bats beaucoup pour accomplir des tâches très faciles.

Quelle serait la bonne syntaxe?

+0

unsigned char bType [4]; – UKMonkey

+2

Quelle est votre question? –

+5

Vous devez apprendre C. – SLaks

Répondre

1

Ce que vous cherchez est bitfields, mais vous avez inutilement mélangé ceux avec union. Rappelez-vous dans un union qu'un seul membre existe à tout moment.

De même, il n'y a pas de type C standard qui, à mon sens, prend 24 bits ou 3 octets. Ainsi, vous pouvez choisir unsigned int qui est généralement 32 bits de taille comme je l'ai fait dans cet exemple

#include<stdio.h> 

typedef struct dUnit{ 
    unsigned int bType : 4; // literally this could store from 0 to 15 
    unsigned int bAmount : 20 ; // we've 1 byte left at this point. 
    unsigned int bPaddding : 8 ;// Waste the remaining 1 byte. 
}dUnit; 

int main() 
{ 
    dUnit obj; 
    unsigned int x; 
    printf("Enter the bType :"); 
    scanf("%d",&x); // You can't do &obj.bType as bType is a bit field 
    obj.bType=x%15; // Not trusting the user input make sure it stays within range 
    printf("Enter the bAmount :"); 
    scanf("%d",&x); //x is just a place holder 
    obj.bAmount=x; // Again you need to filter the input which I haven't done here 

    printf("Entered bType : %d\n",obj.bType); 
    printf("Entered bType : %d\n",obj.bAmount); 

    return 0; 
} 

Note: Vous ne pouvez pas utiliser l'adresse de l'opérateur (&) avec champs de bits.

+0

Merci beaucoup! Et si j'utilise des packs pragma? – Joster

+1

http://format.krzaq.cc/, maye utilise 'uint32_t'? – Stargateur

+0

Est-il nécessaire de spécifier le champ "Padding"? – Joster