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 »


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

Et dis moi, comment est stockée une structure en mémoire ? Est-elle en ram en permanence à la manière d'un tableau ou bien chargée uniquement lorsqu'on s'en sert ? Un telle structure prend quand même pas ma de mémoire !

Posté le : 06/05 11:21
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:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
Salut
Une structure n'est qu'un regroupement de plusieurs variables, ça se comporte donc pareil. Perso en C je m'en sers avec a l'esprit l'idée d'en faire la "programmation objet" du C. je regroupe dans une structure tout ce qui relève de la même responsabilité, du même "objet".

La place occupée va dépendre de la quantité de choses que tu mets dedans et de l'alignement dont t'as déjà parlé Jacques. Sur le S08 l'alignement doit pas poser soucis il me semble mais sur 32 bit ça met un gros bazar.

Tu peux faire un sizeof(mastructure) pour connaitre la taille; sachant que s'il y a alignement et que ça pose soucis alors tu as des commandes de compilation qui te permettent de dire au compilo de ne pas aligner. (perte de perf mais gain de place et suppression des effets de bord)


Par défaut c'est pris en RAM mais tu peux, comme pour toute donnée la définir en constante en flash.

Posté le : 06/05 11:31
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
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
Merci David,

Ben le soucis, c'est que cette structure dois servir de buffer à la fois pour l'emission que pour la réception, donc en ram.

En gros il faut envoyer cette structure avec quelques valeurs initialisées au serveur, et, après vérification, ce même serveur renvoi la même trame avec l'heure actuelle.

Posté le : 06/05 11:45
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
Salut, mauvaise nouvelle, La virtualisation sous Windows pose encore pas mal de problèmes: soit je peux utiliser VMware, soit je peux émuler un terminal Android, et comme je m'essaie à Android pendant le confinement ...
Donc pas de machine virtuelle et pas de CodeWarrior.

J'ai tout de même fait quelques tests. Mais ce sera du code pour du PC. J'ai fait les tests grâce à WSL (Windows Subsystem for Linux, une distribution Debian en l'occurrence), donc compilateur gcc.

test1:
#include <stdint.h>
#include <stdio.h>

int main()
{
   
struct myStruct {
      
int8_t v1;
      
int16_t v2;
      
int32_t v3;
      
int32_t v4;
   } 
str = {57232};

   
uint8_t= &str;
   for (
int i=0sizeof(str); i++)
        
printf("%02x "p[i]);

   return 
0;
}

A la compilation: Citation :
testStruct_S08.c:13:17: warning: initialization of ‘uint8_t *’ {aka ‘unsigned char *’} from incompatible pointer type ‘struct myStruct *’ [-Wincompatible-pointer-types]
uint8_t* p = &str;

C'est un warning, correspondant je pense au problème d'incompatibilité que tu as du rencontré. Mais l'exécutable est généré et l'affichage (en hexadécimal) donne: Citation :
05 7f 07 00 17 00 00 00 02 00 00 00
On reconnait bien les valeurs stockées dans la structure, avec l'alignement dont je parlais. Les "trous" sont comblés avec des valeurs non significatives.

J'applique la solution que je t'ai donnée hier pour supprimer le problème d'incompatibilité:
uint8_t= (uint8_t*)&str;
Plus de warning à la compilation, donc à priori ça devrait aussi marcher pour toi.

Sinon, pour le problème d'alignement (que tu ne devrais pas rencontrer je pense), je l'ai supprimé avec un attribut au niveau de la structure:
struct  __attribute__((__packed__)) myStruct {
. packed permet de compacter la structure et bouche les trous.
Résultat:Citation :
05 07 00 17 00 00 00 02 00 00 00
Et là c'est tout bon.

A+




Posté le : 06/05 12:08
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
Désolé, je n'avais pas vu ton message #11.

Charly t'a répondu. pas grand chose à ajouter.
Juste peut-être pour dire que si ta structure était définie comme un type, ça n'occuperait aucune place puisqu'un type est abstrait.
Mais chaque variable instanciée à partir de ce type va occuper physiquement la place nécessaire en RAM. Cette place peut être obtenue par l'opérateur sizeof (si, si, c'est bien un opérateur) comme Charly l'a évoqué.

Posté le : 06/05 14:10
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
Merci pour vos messages.

Sympa d'avoir ressorti tout ton attirail de VM pour tester cela !

Oui je comprend maintenant l'histoire de l'alignement. Effectivement, la résolution de 8 bits d'un S08 étant la plus petite, je ne pense pas retrouver ce problème puisque j'avais bien mes données parfaitement alignées et sans trous dans mon tableau du pointeur p.

Le code que tu me donnes
uint8_t= (uint8_t*)&str;
me parait "forcer" le type de la structure renvoyé dans le pointeur U8 ...?

Je vais donc essayer ce code en début de soirée pour voir. Dans tous les cas, le méthode que j'ai essayer hier en récupérant l'adresse du premier membre fonctionne aussi parfaitement, et j'ai la sensation d'avoir dupé mon compilateur

Quand à sizeof(), j'ai toujours pas fait mes 1ers pas !

Posté le : 06/05 17:01
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
uint8_t= (uint8_t*)&str;


Ok ce code fonctionne nickel. Tu peux m'expliquer du coup cette syntaxe ? ça peut s'employer dans d'autres cas ?

Posté le : 06/05 18: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
Citation :
Le code que tu me donnes
uint8_t* p = (uint8_t*)&str;
me parait "forcer" le type de la structure renvoyé dans le pointeur U8 ...?
C'est juste pour "rassurer" le compilateur. Il faut évidemment que les 2 variables soient compatibles. Ici, ce sont des pointeurs, donc pas de problème pour caster à priori. Mais c'est le programmeur qui en prend explicitement la responsabilité.

Posté le : 06/05 18:53
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
Citation :
Ok ce code fonctionne nickel. Tu peux m'expliquer du coup cette syntaxe ? ça peut s'employer dans d'autres cas ?
Oui, ça s'appelle un cast, ou transtypage en français.
lors de l'évaluation de l'expression, le type du membre de droite de l'affectation va être transformée de pointeur de myStruc en pointeur de uint8_t (uint8_t est défini comme un unsigned char dans stdint.h).

Ca sert davantage en C++ où le compilateur est très strict sur la vérification des types. C++ a d'ailleurs bien évolué sur ce plan et la méthode que je t'ai donnée est à éviter en C++ "moderne". Il est demandé d'utiliser les mots clés tel que static_cast, reinterpret_cast, const_cast, dynamic_cast, mais j'avoue m'en taper un peu et je caste toujours à la C.

Posté le : 06/05 19: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
Ok. Ça m'emmène à une nouvelle question. Je caste parfois "à la bourrin" des valeurs word dans du char. Souvent, ce sont des calculs que j'effectue et qui ne passeraient pas avec du char mais dont le résultat lui, y rentre. Le compilateur me met donc l'erreur passable "possible loss of data". Je suppose qu'une syntaxe existe ?

Posté le : 06/05 20:58
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]