16 bits signés, float, et chaine de caractères [Forums - Langage C]
16 bits signés, float, et chaine de caractères [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: 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
Hors Ligne
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 u8decTempU8 u8centainesU8 u8dizainesU8 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
Transférer la contribution vers d'autres applications Transférer


Re: 16 bits signés, float, et chaine de caractères
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
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)
puis un return maVariable;

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 !
Transférer la contribution vers d'autres applications Transférer


Re: 16 bits signés, float, et chaine de caractères
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
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 u8decTempU8 u8centainesU8 u8dixainesU8 u8unites)
{
    
U8 u8rest;
    
u8centaines = (u8decTemp 100) + 48;
    
u8rest u8decTemp 100;
    
    
u8dixaines = (u8rest 10) + 48;
    
u8rest u8rest 10;
    
    
u8unites = (u8rest) + 48;
}


Et voici là ou je l'appelle :

void show_on_LCD (void)
{

    
    switch (
u8index_var)                //Function of witch switch was pressed
            
{
                case 
1:
                {
                    
U8 u8cent;
                    
U8 u8dix;
                    
U8 u8unit;
                    
extern byte u8tempTs;
                    
                    
ClearDisplay();
                    
ShowX(line1_1);
                    
decToASCII(u8tempTs,u8cent,u8dix,u8unit); <<<<<<<<<<<<<<<<<
                    
ShowVal(u8cent);
                    
ShowVal(u8dix);
                    
ShowVal(u8unit);
                    
                    
nextline();
                    
ShowX(line2_1);
                    
//ShowVal(test);
                
}
                break;


C'est quoi le truc ??

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


Re: 16 bits signés, float, et chaine de caractères
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
J'ai du rajouter des volatiles car tout passait en "dead code" à l'intérieur même de la fonction ;

void decToASCII(U8 u8decTempvolatile U8 u8centainesvolatile U8 u8dixainesvolatile U8 u8unites

    
U8 u8rest
    
u8centaines = (u8decTemp 100) + 48
    
u8rest u8decTemp 100
     
    
u8dixaines = (u8rest 10) + 48
    
u8rest u8rest 10
     
    
u8unites = (u8rest) + 48
}


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 !
Transférer la contribution vers d'autres applications Transférer


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
Hors Ligne
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 u8decTempU8u8centainesU8u8dixainesU8u8unites)  
{  
    
U8 u8rest;  
    *
u8centaines = (u8decTemp 100) + 48;  
    
u8rest u8decTemp 100;  
      
    *
u8dixaines = (u8rest 10) + 48;  
    
u8rest u8rest 10;  
      
    *
u8unites = (u8rest) + 48;  
}

et dans la fonction appelante:
...
decToASCII(maValeur, &mesCentaines, &mesDizaines, &mesUnites);
...


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 
{
   
U8 u8centaines;
   
U8 u8dixaines;
   
U8 u8unites;
centDizUnit;


définition de la fonction:
centDizUnit decToASCII(U8 u8decTemp)  
{  
    
centDizUnit result;
    
U8 u8rest;  
    
result.u8centaines = (u8decTemp 100) + 48;  
    
u8rest u8decTemp 100;  
      
    
result.u8dixaines = (u8rest 10) + 48;  
    
u8rest u8rest 10;  
      
    
result.u8unites = (u8rest) + 48;  
    
    return 
result;
}


et dans la fonction appelante:
centDizUnit monResultat;
monResultat decToASCII(maValeur);


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
Transférer la contribution vers d'autres applications Transférer


Re: 16 bits signés, float, et chaine de caractères
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
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 !
Transférer la contribution vers d'autres applications Transférer


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
Hors Ligne
Citation :
Par contre où déclare t'on le typedef struct
Si ton programme tient dans un seul fichier, tu peux le mettre au début, après les #include ... par exemple. typedef permet de créer de nouveaux types qui doivent simplement être définis avant de les utiliser.
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 ?
Non, les 2 prototypes suivants conviennent:
centDizUnit decToASCII(U8 u8decTemp);

centDizUnit decToASCII(U8);

Posté le : 12/04/2016 22:02
Transférer la contribution vers d'autres applications Transférer


Re: 16 bits signés, float, et chaine de caractères
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
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 !
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

16 bits signés, float, et chaine de caractères [Forums - Langage C]