
Re: Structures, unions... ? |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Oui bon écoutes, le principal c'est que cela fonctionne et que je dispose d'assez de RAM pour le reste.
En tout cas merci encore pour ton aide.
Posté le : 13/05/2020 17:38
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: Structures, unions... ? |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
27/09/2005 18:07 De Metz
Messages:
1354
![]() |
Non, en tout cas pas comme cela.
Quand tu fais: U8 tableau[48]; c'est comme si tu définissais un pointeur constant, donc impossible de modifier l'adresse de tableau. La seule solution, c'est l'allocation dynamique, mais je doute que le compilateur l'autorise sur ces petits µContrôleurs.
Posté le : 13/05/2020 00:59
|
|
![]() |
Re: Structures, unions... ? |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Bonsoir,
J'arrive à récupérer l'heure UTC par NTP et désormais, ma carte est dans les temps ![]() Mais j'ai bien galéré depuis quelques jours. Autant la conversion des secondes en heure ne m'a pas trop embêté, autant j'ai manipulé ma structure dans tous les sens à tel point que j'en ai fait un cauchemard ! En effet, je me suis obstiné à déclarer ma structure dans 2 fonctions différentes, Send_NTP() et Recv_NTP(), avec juste un pointeur entre les 2. Tout ça pour économiser 48 octets dont seulement 4 contiennent les secondes si précieuses ... A cause de petits soucis de mes buffer Rx et Tx partagés avec d'autre protocoles, je voulais créer la structure dans Send_NTP(), balancer mes données au serveur à partir de l'adresse pointeur octet par octet, récupérer le packet à jour du NTP en recréant la même structure dans Recv_NTP(), toujours à partir du pointeur. Seulement voilà , et même si au fond je le sais, cette méthode de construire/détruire au sein d'une fonction, et même si le pointeur pointe toujours au même endroit, les données dans ma structure au moment de l'envoie étaient corrompues par le reste du programme ... Bref je déclare donc ma structure en tant que variable globale. J'ai voulu tenter de mettre ces 2 fonctions dans une principale, afin de déclarer ma structure dans celle-ci, mais j'avais plus la foi. Ma nouvelle question, est-il possible de déclarer dans une fonction, un tableau[48] avec un pointeur autre, et dans son collimateur la case tableau[0] ?? Ceci par exemple ne fonctionne pas puisque le tableau est fixe avec une autre adresse pour la case 0 :
extern U8 *p;
En fait ce serait de pouvoir déclarer un tableau provisoire à partir de l'adresse d'un pointeur existant avant ? Bon désolé pour le pavé
Posté le : 13/05/2020 00:13
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: Structures, unions... ? |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Citation :
mais je ne le conseille pas Non effectivement je pense que c'est un danger. Je pensais peut-être qu'il existait une syntaxe capable de faire du cast et prouvant au compilateur qu'on est conscient de ce que l'on fait, par exemple mettre un U16 dans un U8. Bon en tout cas merci pour ton aide, et aussi David.
Posté le : 07/05/2020 11:37
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: Structures, unions... ? |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
27/09/2005 18:07 De Metz
Messages:
1354
![]() |
Pour ce cas précis je ne pense pas car il y a vraiment risque de perte de donnée. Ca serait pareil en passant de double à float je pense.
Il doit y avoir moyen de paramétrer le niveau de warning ou quels sont les warnings qu'on veut éliminer, mais je ne le conseille pas.
Posté le : 06/05/2020 21:27
|
|
![]() |
Re: Structures, unions... ? |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
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/2020 20:58
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: Structures, unions... ? |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
27/09/2005 18:07 De Metz
Messages:
1354
![]() |
Citation :
Ok ce code fonctionne nickel. Tu peux m'expliquer du coup cette syntaxe ? ça peut s'employer dans d'autres cas ? 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/2020 19:17
|
|
![]() |
Re: Structures, unions... ? |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
27/09/2005 18:07 De Metz
Messages:
1354
![]() |
Citation :
Le code que tu me donnes
Posté le : 06/05/2020 18:53
|
|
![]() |
Re: Structures, unions... ? |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
uint8_t* p = (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/2020 18:51
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: Structures, unions... ? |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
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* p = (uint8_t*)&str;
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/2020 17:01
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |