Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Ecran tactile autour d'un PIC18F87J50
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#61 Message par Jérémy » ven. 22 janv. 2016 18:48

C'est vraiment pas gagné et j'ai vraiment du mal avec les sprintf les pointeurs et tout et tout ; allez j’insiste encore car j’aimerais bien avancé
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Ecran tactile autour d'un PIC18F87J50
sylvain54
Avatar de l’utilisateur
Amateur
Amateur
Messages : 194
Âge : 51
Enregistré en : août 2015
Localisation : Dans l'est de la France

#62 Message par sylvain54 » sam. 23 janv. 2016 11:00

Un weekend end chargé en perspective ;) Courage !!

Ecran tactile autour d'un PIC18F87J50
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#63 Message par Jérémy » sam. 23 janv. 2016 11:05

Bonjour ,

Je fais un petit hors sujet, car j'ai a peu prêt réussis a afficher mes valeurs, mais sans réellement comprendre ! j'ai donc continuer à faire des tests pour me familiariser avec ceci, mais je perds pieds et confond tout .

Si je ne met pas de terminateur de string, ce sera donc la longueur de mon conteneur ( tableau) qui devrait faire office de fin de string ? Comme a chaque lecture de mon buffer en réception min index_buffer est remis à zéro, je devrais écrire par dessus l'ancien texte ( ayant pris soin de l'effacer avant ). et pour tant j'observe des bugs
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Ecran tactile autour d'un PIC18F87J50
sylvain54
Avatar de l’utilisateur
Amateur
Amateur
Messages : 194
Âge : 51
Enregistré en : août 2015
Localisation : Dans l'est de la France

#64 Message par sylvain54 » dim. 24 janv. 2016 19:17

Salut,

Je ne peux vraiment pas t'aider sur ce sujet,
J'ai des écrans TFT (proto TFT et easy TFT) mais Je n'ai pas de PIC18F87J50.
Je n'ai que des 18F4620, 18F4550, 18F45K22. Ces pics ne sont pas assez performants pour faire tourner un TFT (normalement). J'ai des PIC24, mais après cela ne sera plus comparable par rapport au 18F87J50.

Bon courage.

++

Ecran tactile autour d'un PIC18F87J50
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#65 Message par satinas » lun. 25 janv. 2016 00:00

Salut

Il n'y a ni chaîne ni string en C, il n'y a que des tableaux de caractères !

Ensuite on a créé des fonctions de type strlen(), strcpy() qui ne marchent que sur des suites de caractères terminées par un octet nul. On appelle chaîne ces suites de caractères, et elles sont forcément incluses dans un tableau de caractères. Si on applique ces fonctions à une chaîne non finie par un octet nul, le pire peut arriver ! (car ce n'est pas une chaîne en fait)

Si le tableau char tab[9] contient "abc0de0fg" (les deux 0 étant des octets nuls, pas des caractères '0')
Ce tableau tab contient les 6 chaînes -> "abc" "bc" "c" "de" "e" ""
strlen(tab) -> 3 (chaîne "abc")
strlen(&tab[1]) -> 2 (chaîne "bc") autre syntaxe -> strlen(tab+1)
strlen(&tab[2]) -> 1 (chaîne "c")
strlen(&tab[3]) -> 0 (chaîne "")
strlen(&tab[4]) -> 2 (chaîne "de")
strlen(&tab[5]) -> 1 (chaîne "e")
strlen(&tab[6]) -> 0 (chaîne "")
strlen(&tab[7]) -> résultat indéterminé ou plantage, car pas d'octet qui indique la fin de chaîne
strlen(&tab[8]) -> résultat indéterminé ou plantage, car pas d'octet qui indique la fin de chaîne
strlen(&tab[9]) -> résultat indéterminé ou plantage, car on est en dehors du tableau

Si tu mets un octet nul dans le tableau, tu crées une fin de chaîne (il peut y en avoir d'autres comme dans l'exemple). Les caractères qui suivent cet octet nul sont inchangés, et si ton tableau n'a aucun octet nul, il ne contient aucune chaîne.

si je fais strcpy(tab, "xy"); le tableau va passer de "abc0de0fg" à "xy00de0fg"
le strcpy a copié les octets, ajouté l'octet nul de fin de chaîne, et n'a pas touché aux 6 derniers octets. car il se fout de savoir ce qu'il y avait dans le tableau avant, et il ne se sait pas non plus la taille du tableau, alors gare au plantage si tu dépasses sa taille, la manipulation de chaînes en C, c'est sans garde-fou ...

Ecran tactile autour d'un PIC18F87J50
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#66 Message par Jérémy » lun. 25 janv. 2016 07:23

Superbe explication satinas. C'est beaucoup plus clair expliqué comme ça. Un GRAND merci à toi !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Ecran tactile autour d'un PIC18F87J50
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#67 Message par paulfjujo » lun. 25 janv. 2016 10:29

bonjour,

tu as un joli bug !

Code : Tout sélectionner


char P_Variable
[32];
unsigned char var0=100, var1=101,var2=102, var3=103, var4=104, var5=105, var6=106, var7=110;
 sprintf(P_Variable,"%3u  %3u  %3u  %3u  %3u  %3u  %3u  %3u",var0,var1,var2,var3,var4,var5,var6,var7); 
8x3
=24 + 7 espaces=31 + zero terminateur


=> NON , pas dans ce cas avec %3u
occupe > 50 bytes ...> OVERFLOW
la table p_Variable explose des la 4em valeur => bazar dans le programme
puisque stocke 6 car par valeur ( unsigned int)

Verifiable en mode debugger et tracage des variables.

sprintf ne sait pas afficher des bytes (octets) en hexadecimal
ex:
spintf(P_variable,"%2X....
il lui faut un ENTIER comme argument
sprintf(P_Variable,"%2X ... ",(int)var1,
j'avais déja signalé cette anomalie sur MikroE Forum, ne suit pas la norma ANSI C
.

il en est de meme pour le parametre %3u le u unsigned doit etre un entier et non un byte

Code : Tout sélectionner

sprintf(P_Variable,"%3u %3u %3u %3u %3u %3u %3u %3u",(int)var0,(int)var1,(int)var2,(int)var3,(int)var4,(int)var5,(int)var6,(int)var7); 

donnera le resultat escompté .
Aide toi, le ciel ou FantasPic t'aidera

Ecran tactile autour d'un PIC18F87J50
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#68 Message par Jérémy » lun. 25 janv. 2016 19:29

Désolé Paul , je n'ai pas compris ta remarque ?

%3u c'est pareil que %3d sauf que l'un est signé l'autre non , non ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Ecran tactile autour d'un PIC18F87J50
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#69 Message par paulfjujo » mar. 26 janv. 2016 09:28

bonjour,

oui, %3d pour du signé (-128 a 127) et %3u pour du non signé(0 à 255)

mais le pb n'est pas là.
il faut un casting devant la variable en byte
(int)var0 pour que le %3u soit correctement interpreté par le sprintf.
Aide toi, le ciel ou FantasPic t'aidera

Ecran tactile autour d'un PIC18F87J50
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#70 Message par Jérémy » mar. 26 janv. 2016 09:57

Je viens d'essayer

if (((BP6==1) && (UART1_Tx_Idle() == 1))) // Check le BP6 et le buffer
{
var0++; var1++; var2++; var3++; var4++; var5++; var6+=100; var7+=1000; // On incremente nos compteurs
Lcd_Out (1, 8,"COMPTEUR+"); // On l'affiche sur le LCD de l'emettteur
sprintf(P_Variable,"%3u %3u %3u %3u %3u %3u %3u %3u",(int)var0,(int)var1,(int)var2,(int)var3,(int)var4,(int)var5,(int)var6,(int)var7); // On convertit
UART1_Write_Text(P_Variable); // Envoie du texte
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
delay_ms(80);
}


Je ne trouve pas de changement. Ca bug encore pour l'affichage du mot "Compteur+" sur le lcd ; il se déplace et s’inscrit partout sur le LCD .
Je suis obligé de le placé après le sprintfpour ne pas avoir de bug.

Pour avoir un comportement correct voici mon bout de code :

Code : Tout sélectionner

    if (((BP6==1) && (UART1_Tx_Idle() == 1)))  // Check le BP6 et le buffer
       
{
            
var0++; var1++; var2++; var3++; var4++; var5++; var6+=100var7+=1000;   // On incremente nos compteurs
            
sprintf(P_Variable,"%3u  %3u  %3u  %3u  %3u  %3u  %3u  %3u",(int)var0,(int)var1,(int)var2,(int)var3,(int)var4,(int)var5,(int)var6,(int)var7);  // On convertit
            
Lcd_Out (18,"COMPTEUR+");       // On l'affiche sur le LCD de l'emettteur
            
UART1_Write_Text(P_Variable);     // Envoie du texte
            
UART1_Write(13);                  // envoie un CR
            
UART1_Write(10);                  // Envoie un CL
            
delay_ms(80);
       } 
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 88 invités