faire une fonction qui retourne une chaine de caractere

faire une fonction qui retourne une chaine de caractere - C - Programmation

Marsh Posté le 21-10-2008 à 20:31:46    

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

Reply

Marsh Posté le 21-10-2008 à 20:31:46   

Reply

Marsh Posté le 21-10-2008 à 21:14:46    

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.

Reply

Marsh Posté le 21-10-2008 à 21:51:46    

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
Reply

Marsh Posté le 21-10-2008 à 23:47:50    

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
Reply

Marsh Posté le 22-10-2008 à 10:05:04    

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.

Reply

Marsh Posté le 22-10-2008 à 18:54:10    

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
Reply

Marsh Posté le 22-10-2008 à 20:25:27    

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.
 

Reply

Marsh Posté le 22-10-2008 à 23:20:29    

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)

Reply

Marsh Posté le 23-10-2008 à 00:47:27    

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

Reply

Marsh Posté le 23-10-2008 à 07:35:17    

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"

Reply

Marsh Posté le 23-10-2008 à 07:35:17   

Reply

Marsh Posté le 23-10-2008 à 07:40:20    

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

Reply

Marsh Posté le 23-10-2008 à 14:09:35    

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

Reply

Marsh Posté le 23-10-2008 à 14:28:09    

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"

Reply

Marsh Posté le 23-10-2008 à 23:19:59    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed