Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
656 connectés 

  FORUM HardWare.fr
  Programmation
  C

  faire une fonction qui retourne une chaine de caractere

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

faire une fonction qui retourne une chaine de caractere

n°1802948
sliders_al​pha
Posté le 21-10-2008 à 20:31:46  profilanswer
 

plop plop.
alors voila, j'ai fait ce genre de fonction pour un programme de µC, et ça marche niquel (compilo CCS V4.057)
 
exemple d'une fonction

Code :
  1. char *move(int lenght, char *chaine){
  2.    int counter = 0;
  3.    int bicount = 0;
  4.    int pass = 0;
  5.    while (pass != lenght)
  6.    {
  7.    counter = 0;
  8.     while(counter != 22) //la longeur de la chaine est connue
  9.       {
  10.       bicount = counter+1;
  11.       chaine[counter] = chaine[bicount];
  12.       counter++;
  13.       }
  14.    pass++;
  15.    }
  16. return chaine;


 
et je l'utilise comme ça : String = move(12, String) par exemple
 
maintenant j'ai eu besoin de faire la meme chose sur PC, j'ai donc ecrit cela (avec des variable coherente cette fois^^
 

Code :
  1. char *Decaler(char *chaine, int decalage){
  2. int taille = 0;
  3. taille = strlen(chaine);
  4. taille = taille-1;
  5. int compteur = 0;
  6. int CaseActuelle = 0;
  7. int CaseSuivante = 0;
  8.     while(compteur != decalage) //effectue autant de decalage qu'il le faut afin de decaler toute la chaine
  9.      {                       //le caractere numero 0 de la chaine est effacé, le dernier reste a sa place
  10.      CaseActuelle = 0;
  11.      CaseSuivante = 0;
  12.                         //////////////////////////////////////////////////////////////////
  13.      while(CaseActuelle != taille)                                  //
  14.       {                       //
  15.        CaseSuivante = CaseActuelle+1;                      //decalle la chaine de 1 cran vers la gauche
  16.        chaine[CaseActuelle] = chaine[CaseSuivante];            //
  17.       CaseActuelle++;                         //
  18.       }               //
  19.        //////////////////////////////////////////////////////////
  20.      compteur++;
  21.         }
  22. return chaine;
  23. }


 
compilo Lcc win32 et BAM, erreur de compilation
 
sur la ligne "FileSting = Decaler(FileString, 37);" (FileSting fait 200 cara)
 
erreur  "operand of = have illegal type "array 200 of char" and "pointer to char""
 
what's going on X'(
 
thanks

mood
Publicité
Posté le 21-10-2008 à 20:31:46  profilanswer
 

n°1802964
tpierron
Posté le 21-10-2008 à 21:14:46  profilanswer
 

En gros tu as écrit un truc du genre :

Code :
  1. char FileString[200];
  2. char * Decaler(char *, int);
  3. FileString = Decaler(FileString, 37);

Et tu ne vois pas ton erreur ?
 
Je te garanti, que tout compilateur C pas trop pourri, devrait raler avec ton affectation.

n°1802975
sliders_al​pha
Posté le 21-10-2008 à 21:51:46  profilanswer
 

ben non, on ecrit bien patapouf = strlen(unechaine) (patapouf etant un int)  
donc je ne vois pas ou est le problemme
 
et pis surtout, ça marche tres bien sur l'autre compilo alors pourquoi pas sur celui-ci?
 
le must serait d'avoir une fonction comme ça : Decaler(String, X); qui decale String de X vers la gauche et strocke le resultat dans String, mais je ne vois pas du tout comment faire


Message édité par sliders_alpha le 21-10-2008 à 23:02:13
n°1802997
regexp42
Eplucheur de RFC.
Posté le 21-10-2008 à 23:47:50  profilanswer
 

Un char[] est une zone contigüe de mémoire, un char * est un pointeur.
 
Quand tu écris
 

Code :
  1. FileString = Decaler(FileString, 37);


 
Ca veut pas dire grand chose, en plus ton API craint, tu renvois un truc que tu passes en paramètre.
 
Essaye d'avoir plutôt un truc comme ça niveau API :
 

Code :
  1. void Decaler(char **str, int decalage)


 
Là tu pourras filer un vrai pointeur. :)


Message édité par regexp42 le 21-10-2008 à 23:48:27
n°1803053
matafan
Posté le 22-10-2008 à 10:05:04  profilanswer
 

sliders_alpha, le problème c'est qu'un tableau ne peux pas être une lvalue, parce que l'adresse d'un tableau n'est stockée nul part en mémoire.
 
Celà dit vu ce que fait ta fonction, elle n'a pas besoin de retourner quoi que ce soit, puisqu'elle modifie déjà la chaine passée en paramètre. En fait ta fonction fait déja exactement ce que tu dis ne pas savoir comme faire. Tu peux l'utiliser comme ça : Decaler(String, X);
 
Ensuite il faut faire gaffe parce que si ta chaine FileString est une variable globale, alors pour beaucoup de compilos ça veut dire qu'elle est constante. Tu ne peux pas la modifier. Donc il faut soit que ce soit un tableau dans la stack de l'appelant (une variable locale, quoi), soit l'allouer dynamiquement.

n°1803291
sliders_al​pha
Posté le 22-10-2008 à 18:54:10  profilanswer
 

matafan a écrit :

sliders_alpha, le problème c'est qu'un tableau ne peux pas être une lvalue, parce que l'adresse d'un tableau n'est stockée nul part en mémoire.
 
Celà dit vu ce que fait ta fonction, elle n'a pas besoin de retourner quoi que ce soit, puisqu'elle modifie déjà la chaine passée en paramètre. En fait ta fonction fait déja exactement ce que tu dis ne pas savoir comme faire. Tu peux l'utiliser comme ça : Decaler(String, X);
 
Ensuite il faut faire gaffe parce que si ta chaine FileString est une variable globale, alors pour beaucoup de compilos ça veut dire qu'elle est constante. Tu ne peux pas la modifier. Donc il faut soit que ce soit un tableau dans la stack de l'appelant (une variable locale, quoi), soit l'allouer dynamiquement.


 
nan, je n'utilise jamais de variable globale.
 
c'est donc pour ça, cet apres midi j'ai esseyer de mettre 2 etoile, 3, uniquement sur les variable, sur les variable et paramettre et au final en mettant juste une etoile dans le prototype, j'ai ete etonnée de voir que la valeur de ma chaine locale a reussi a sortir de la fonction pour se mettre dans la chaine qui etait en parametre
 
en clair
 
[code]
 
void (char * chaine, int decalage){
blabla blabla
}
 
[code]
 
reussi a modifier le contenu de la chaine que je lui passe en parametre
 
j'ai d'ailleur remarquer que quand je declare un talbleau sur mon PC (avec LCC) ex : tab[3] j'ai acces a tab[0], tab[1], tab[2].
alors que sur nos compilo pour µcontrolleur, quand je declare tab[3] j'ai acces a tab[1], tab[2], tab[3] (tab[0] n'existe pas)
 
ça varie d'un compilo a l'autre? c'est une option a regler?


Message édité par sliders_alpha le 22-10-2008 à 19:07:34
n°1803320
tpierron
Posté le 22-10-2008 à 20:25:27  profilanswer
 

Nan, ça ne varie pas d'un compilo à l'autre. Même les compilos C préhistoriques (genre des années 70), utilise des tableaux indicés à 0.
 
Un détail à savoir aussi : quand tu déclares un tableau du genre "int tab[3];", tous les compilateurs vont t'autoriser à accéder à tab[3], sans émettre le moindre avertissement. Pire : même en écrivant dans cette zone non réservée, tu peux ne pas avoir d'erreur (c.à.d de crash).
 
Bref, tout ça pour dire, qu'il y a (à une erreur d'arrondi près) 100% de chance pour que ton compilateur utilise des indices commençant à 0 et pas à 1. Et si dans le cas extrêmement peu probable où il commence à 1, bah, ton compilo n'est pas un compilo C.
 

n°1803382
sliders_al​pha
Posté le 22-10-2008 à 23:20:29  profilanswer
 

ben c'est possible hein, on utilise des vieuuuuuux logiciel au bahut, par exemple pour programmer nos PLD on utilise un logiciel qui ne fonctionne que sous windows 95, on doit passer tour par tour sur un vieux pc =D
notre version de CCS (le compilo C pour PIC) est veille aussi, en tous cas, le tableau, n'avait pas d'incice 0, ça commençais a 1 (je ne comprenais pas d'ailleur au debut pourquoi mes programme ne marchais pas)

n°1803389
sligor
Posté le 23-10-2008 à 00:47:27  profilanswer
 

un tableau commence forcement à 0 c'est question de syntaxe puisque
table[i]=*(table+i) se qui implique forcement que table[0]=*table

n°1803397
sliders_al​pha
Posté le 23-10-2008 à 07:35:17  profilanswer
 

je referais un essais aujourd'hui si tu veux, hier je devais faire coller un relais apres une combinaison de 4 touche.
je faisait donc rentrer le numero du bouton boussoir qui a ete apuyé fans un tableau a 4 case.
j'ecrivais donc ButtonTab[3] = 'x';
et pour verifier mon programme je fesais sortir du texte en RS232 sur une broche du PIC.
et le 'x' etait dans la troisiemme case, y ma fallu un bout de temps avant de comprendre que pour avoir acces il fallait ecrire ButtonTab[4]
 
le tableau avait été declaré de la valeur suivante :
 
char ButtonTab[] = "7777"

mood
Publicité
Posté le 23-10-2008 à 07:35:17  profilanswer
 

n°1803398
matafan
Posté le 23-10-2008 à 07:40:20  profilanswer
 

Alors déja ton tableau ButtonTab il a 5 cases, pas 4...

n°1803543
sliders_al​pha
Posté le 23-10-2008 à 14:09:35  profilanswer
 

pourquoi? lors de l'initialisation j'ai mis 4 caractere dedans, comment pourrait-il avoir 5 case?

n°1803562
MagicBuzz
Posté le 23-10-2008 à 14:28:09  profilanswer
 

parcequ'en C toute chaîne de caractères termine par \0 donc quand tu initialise ton array avec "7777" il crée 4 caractères "7" et un caractère "\0"

n°1803835
sliders_al​pha
Posté le 23-10-2008 à 23:19:59  profilanswer
 

interessant, ça expliquerait enormement de problemme que je rencontrait avec les chaine de caractere dans certain programme xD


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  faire une fonction qui retourne une chaine de caractere

 

Sujets relatifs
tester la présence d'un espace dans une chaine.Equivalent de la fonction TEXTE d Excel ?
Sommes multi-conditionnelle[Asm]Cryper une chaine de caractere
Rechercher la suite d'un début de chaine de caractères[Access] fonction arrondi sup
Fonction in_array en php[Access] - l'expression ne fait pas partie de la fonction d'agregat
Plus de sujets relatifs à : faire une fonction qui retourne une chaine de caractere


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR