Parcourir ce sujet :
1 Utilisateur(s) anonymes
Re: 16 bits signés, float, et chaine de caractères |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
13/10/2005 10:06 De haute-savoie (74)
Messages:
1164
![]() |
Salut,
La critique que je fais à ton code ce sont les variables de sortie qui semblent être globales ! Ce serait plus élégant de les passer soit en paramètre dans ta fonction et les modifier à l'intérieur de celle-ci, soit de passer par une structure ce qui est un poil plus compliqué. Mais ne laisse pas ça en variable globale. C'est inutile de consommer de la mémoire pour ce genre de fonction. Donc ton proto de fonction pourrait être :
void decToASCII(U8 u8decTemp, U8 u8centaines, U8 u8dizaines, U8 u8unites)
et tu initialises tes registres de retour dans ta fonction appelante et il seront mis à jour au retour de la fonction soit tu fait une structure que tu peux soit passer par paramètre de la même manière, soit que tu peux pointer...
Posté le : 11/04/2016 17:56
|
|
![]() |
Re: 16 bits signés, float, et chaine de caractères |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Au départ, les variables étaient bien locales. Probleme je ne savais pas sortir plus de une variables de cette fonction. D ce que j'ai compris, pour une seule variable, je faisais
U8 fonction(void)
La comment faire avec ton proto ? Sachant que si je n'utilise pas ces variables juste après, les données seront perdues ?
Posté le : 11/04/2016 19:41
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: 16 bits signés, float, et chaine de caractères |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Là ça se corse pour moi ! Je ne comprend plus quand les variables en paramètres sont "entrantes" ou "sortantes".
Je réessaye en variable locale, et voici la fonction :
void decToASCII(U8 u8decTemp, U8 u8centaines, U8 u8dixaines, U8 u8unites)
Et voici là ou je l'appelle :
void show_on_LCD (void)
C'est quoi le truc ??
Posté le : 11/04/2016 23:14
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: 16 bits signés, float, et chaine de caractères |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
J'ai du rajouter des volatiles car tout passait en "dead code" à l'intérieur même de la fonction ;
void decToASCII(U8 u8decTemp, volatile U8 u8centaines, volatile U8 u8dixaines, volatile U8 u8unites)
La fonctione s'execute bien, mais les valeurs u8cent, u8dix, u8unit gardent les valeurs déclarées dans la fonction appelante void show_on_LCD (void)
Posté le : 12/04/2016 10:15
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: 16 bits signés, float, et chaine de caractères |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
27/09/2005 18:07 De Metz
Messages:
1354
![]() |
C'est normal car tes variables sont locales et sont par conséquent affectées sur la pile, ce qui fait qu'elles disparaissent à la fin de la fonction. Tu as 2 solutions pour résoudre le problème:
1) passage de paramètre par adresse, et donc utilisation de pointeurs
void decToASCII(U8 u8decTemp, U8* u8centaines, U8* u8dixaines, U8* u8unites)
et dans la fonction appelante:
...
2) avec une structure qui permet "d'encapsuler" centaines, dizaines et unités dans une seule et même entité définition de la structure de données:
typedef struct
définition de la fonction:
centDizUnit decToASCII(U8 u8decTemp)
et dans la fonction appelante:
centDizUnit monResultat;
les valeurs sont accessibles dans la structure, par exemple pour obtenir les centaines il faudra écrire monResultat.u8centaines Bonne lecture.
Posté le : 12/04/2016 11:31
|
|
![]() |
Re: 16 bits signés, float, et chaine de caractères |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Salut Jacques,
Merci d'avoir pris le temps de rédiger cet exemple à la fois clair et précis. Forcément ça marche beaucoup mieux avec les pointeurs. Et je me rend compte qu'ils sont indispensables pour mon cas. Super ! Pour la structure. Je n'ai pas la notion de "encapsulage", mais je comprend bien l'intérêt. Par contre où déclare t'on le typedef struct, et rien de particulier au niveau du prototype ?
Posté le : 12/04/2016 20:06
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: 16 bits signés, float, et chaine de caractères |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
27/09/2005 18:07 De Metz
Messages:
1354
![]() |
Citation :
Par contre où déclare t'on le typedef struct Si le programme est conséquent et doit être réparti dans plusieurs fichiers, vu que ce type peut être utilisé dans plusieurs de ces fichiers, on place le typedef ... dans un fichier d'entête (.h) que l'on inclus dans les fichiers qui en ont besoin. Citation : et rien de particulier au niveau du prototype ?
centDizUnit decToASCII(U8 u8decTemp);
centDizUnit decToASCII(U8);
Posté le : 12/04/2016 22:02
|
|
![]() |
Re: 16 bits signés, float, et chaine de caractères |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Ok bien compris. Je vais si j'utilise l'une ou l'autre des solutions.
Encore merci Jacques pour ton aide ![]()
Posté le : 12/04/2016 22:32
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
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.