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

Comment copier une chaine de caractere ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » dim. 17 janv. 2016 10:39

Bonjour à tous,

je n'arrive pas a copier proprement une chaine de caractères, connaissez vous une méthode adéquat ?

Je récupère via l'UART une chaine de caractères que je stocke dans une variable type tableau Rx_Buffer[] . Comme j'affiche cette chaine de caractère sur mon écran, il faut que je la sauvegarde quelque part pour pouvoir la réutiliser après avoir reçu une nouvelle chaine de caractère ( pour l'effacer en fait) .

Penser vous qu'il faut que je copie caractère par caractère dans une routine spéciale ? désolé , je me mélange les pinceaux avec les pointeurs tableaux string etc .. ce n'est pas encore devenu clair comme de l'eau de roche pour moi :D mais plutôt de la boue :D
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Comment copier une chaine de caractere ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » dim. 17 janv. 2016 12:04

bonjour,


Je récupère via l'UART une chaine de caractères que je stocke dans une variable type tableau Rx_Buffer[] . Comme j'affiche cette chaine de caractère sur mon écran, il faut que je la sauvegarde quelque part pour pouvoir la réutiliser après avoir reçu une nouvelle chaine de caractère ( pour l'effacer en fait) .


il te faut donc une autre table si tu veux conserver le contenu (precedent) du buffer de reception UART.
il suffit de declarer une autre table avec la bonne taille memoire


#define MaxTaille 80 // à definir
char Autre_Table[MaxTaille];


// la routine strcpy fait le boulot : char *strcpy(char *to, char *from);
strcpy(Autre_Table,Rx_Buffer);

il faut cependant que Rx_Buffer soit considéré comme un string ( pas la ficelle !)
et doit avoir un Zero comme terminateur..
en remplacant par exemple le dernier caractere recu dans Rx_buffer par 0

exemple extrait de ma routineRX interrupt

Code : Tout sélectionner


  
if (c1==CR)
      {
     
// TXREG='@';
      
Flag_Buffer1=1;  // arme drapeau signalant buffer  rempli et validé
      
Buffer1[i1]=0;  // zero pour fin de string
      
Index1=i1;        // recopie dans Index1 , visible dans le main programme ( à utiliser ou pas, mais renseigne sur la longueur d string recu)
      
i1=0;               // RAZ index de stockage dans le buffer
     
}
     else
     {
        
Buffer1[i1]=c1;  // reception en cours, stockage du caractere recu
        
Index1=i1;        // mise à jour Index global
        
i1++;                // incremeny index local 

      
Aide toi, le ciel ou FantasPic t'aidera

Comment copier une chaine de caractere ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » dim. 17 janv. 2016 14:57

Merci Paulfjujo pour ces explications .

j'avais déjà lu un truc sur strcpy, mais je ne m'en souvenez pas ! merci. Je pense que c'est la solution.
sans Zéro terminateur ceci n'est pas considéré comme un string si je comprends bien?

Je ne comprends pas, et ne trouve pas d'info sur ton expression Buffer1[i1]=0; . Que signifie le i1 exactement "i+1" ?

Je pense du coup que je vais faire autrement car plus rapide à priori . c'est de dessiner un rectangle noir sur le texte, plutôt de ré-écrtire le texte en noir. Ainsi je vais définir une zone de texte et j’effacerai avec un rectangle ;
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Comment copier une chaine de caractere ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » dim. 17 janv. 2016 17:43

Que signifie le i1 exactement "i+1" ?


c'est i1++; ou i1=i1+1;
j'incremente l'indice i1 qui sert d'index de rangement du prochain caractere dans le buffer.
C'est peut etre deroutant par rapport à Index1 qui est l'image de l'index du dernier caractere rangé
la difference entre les 2
c'est que i1 pointe sur la prochaine position dans la table
et que Index1 est la derniere position remplie.
Nota: on peut tres bien ignorer Index1 .. si inutilisé ailleurs ..

sans Zéro terminateur ceci n'est pas considéré comme un string si je comprends bien?


Tout à fait, sinon on risque lorsqu'on fait un UART1_Write_Text( Rx_buffer); de deborder de la table
et meme planter le programme ..

C'est pourquoi , si on definit une taille de table de texte pouvant contenir 20 caracteres
il faudrait , de preference , la dimensionner à 21 ( Caracteres de 0 à 19 = 20 emplacements + zero terminateur, le 21em)
au cas ou on utiliserait un string (chaine de caracteres) de longueur 20
Aide toi, le ciel ou FantasPic t'aidera

Comment copier une chaine de caractere ?
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#5 Message par Guest » dim. 17 janv. 2016 17:56

Jérémy a écrit :Je pense du coup que je vais faire autrement car plus rapide à priori . c'est de dessiner un rectangle noir sur le texte, plutôt de ré-écrtire le texte en noir. Ainsi je vais définir une zone de texte et j’effacerai avec un rectangle ;


En voila une bonne idée ;) Tient toujours dans cette ligne c'est comme çà que l'on faisait du temp de VGA une petite idée pour supprimer Tes fonts qui c'est? tes textes en images rapide pas de recherche lettre après lettre affichage rapide comme la fonction rectangle et meme si je me trompe pas tu as la fonction surface

c'est ICI https://fr.wikipedia.org/wiki/Sprite_%2 ... %C3%A9o%29 bon c’était en 2D, l'animation.

A+


Retourner vers « Langage C »

Qui est en ligne

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