Structures, unions... ? [Forums - Langage C]
Structures, unions... ? [Forums - Langage C]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes



(1) 2 3 »


Structures, unions... ?
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Bonjour à tous,

Si je créé une structure avec des types différents, ai-je le moyen, par adressage par exemple, de retrouver l'ensemble de mes données 8bits en mémoire, puisque j'ai un S08 ?

Par exemple la structure suivante (non codée) :

struct(U8 = 0xFF , U16 = 0x0AB1 , U32 = 0x11223344)

Je dois bien pouvoir récupérer quelque par l'équivalent stocké de chaque octet à la suite :

FF,0A,B1,11,22,33,44

Vous l'aurez compris, il me faut envoyer et recevoir des types plus grand qu'un U8 via ma sci ...

Posté le : 05/05 15:51
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Avec un pointeur sur la structure, tu dois pouvoir accéder à n'importe quel octet.
Attention, certains compilateurs alignent les champs en taille pour favoriser la rapidité d'accès. Bon, avec un processeur 8 bits ça ne présente pas d'intérêt, mais je préfère préciser.

Posté le : 05/05 18:17
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Tu veux dires que les données ne seraient pas stockées dans le bon ordre ?

Posté le : 05/05 21:43
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Non, ce n'est pas un problème d'endiannes, mais d'alignement:
Par exemple, tu crées une structure qui stocke un float, un char et un long int (32 bits). Si le compilateur se contente de se faire succéder les octets de ces 3 champs, ça va poser un problème sur un processeur 32 bits par exemple: le char faisant 1 octet, le long int qui suit va démarrer sur une adresse impaire et il faudra donc 2 accès mémoire pour le récupérer en entier.

Du coup, le compilateur va préférer aligner les champs sur des adresse multiples de 4 et le char prendra 4 octets même s'il n'y en a qu'un d'utile.

Posté le : 05/05 21:58
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Ah ok compris.

Bon je viens de réussir.

Par contre, ça ne marche pas lorsque je récupère l'adresse de la structure dans un pointer, car au moment de la copier dans une case U8, le compilateur me plante une erreur de type, puisque le type d'une structure est différent d'un U8 ...

En guise de test, j'ai rempli mon buffer Tx de ma SCI à partir de valeurs arbitraires de la structure.
Donc j'ai été obligé de faire l'adressage à partir du premier membre.

struct ntp_timestamp {
    
U32 seconds;
    
U32 fraction;
};

typedef struct ntp_packet ntp_packet;
struct ntp_packet {
    
U8 flags;
    
U8 stratum;
    
S8 poll;
    
S8 precision;
    
S32 root_delay;
    
S32 root_dispersion;
    
U32 reference_id;
    
struct ntp_timestamp reference_timestamp;
    
struct ntp_timestamp origin_timestamp;
    
struct ntp_timestamp receive_timestamp;
    
struct ntp_timestamp transmit_timestamp;
};


Puis dans le C :

for(;;) {      
      
ntp_packet test;
      
ntp_packet *pointer = &test;
      
U8 *= &test.flags;            //Recup de l'adresse du premier membre

      
test.flags 0xF1;            //Valeurs de test
      
test.poll 0xF1;
      
test.root_delay 0xFAFBFCFD;
      
      for(
064i++)
      {
          
SCI_buffer_Tx[i] = p[i];        //Vérification
      
}


Posté le : 05/05 23:47
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Pffff quelle poisse les structures les unions ça m'a pris la tête !

Posté le : 05/05 23:52
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Tu peux me montrer le code qui ne fonctionne pas avec l'erreur générée?

Posté le : 05/05 23:54
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
for(;;) {      
      
ntp_packet test;
      
ntp_packet *pointer = &test;   //<-----------------------
      
U8 *= &test.flags;            //Recup de l'adresse du premier membre

      
test.flags 0xF1;            //Valeurs de test
      
test.poll 0xF1;
      
test.root_delay 0xFAFBFCFD;
      
      for(
064i++)
      {
          
SCI_buffer_Tx[i] = p[i];        //<-------------------
      
}


Si j'utilise
pointer
ligne 2, à la place
p
dans la boucle for, j'ai l'erreur de type

J'ai créé un pointer de structure (pointer) et un du 1er membre (p)

Posté le : 06/05 00:00
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Qu'est-ce que tu utilises pour développer. Je devrais pouvoir retrouver une vielle machine virtuelle XP avec CodeWarrior encore installé au cas où.

C'est un compilateur C ou C++?

Sinon, en attendant, si tu fais:
U8 *= &test;
tu ne te retrouves pas avec un tableau d'octets accessible avec p?
Au cas où ça coince encore, essaies ça:
U8 *= (U8*)&test;


Posté le : 06/05 00:09
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Je suis sous Codewarrior 10.6 éclipse. En C.

J'essaye ça dés demain. En tout cas merci.

Posté le : 06/05 00:18
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant
(1) 2 3 »



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Structures, unions... ? [Forums - Langage C]