faire une fonction qui retourne une chaine de caractere - C - Programmation
Marsh Posté le 21-10-2008 à 21:14:46
En gros tu as écrit un truc du genre :
Code :
|
Et tu ne vois pas ton erreur ?
Je te garanti, que tout compilateur C pas trop pourri, devrait raler avec ton affectation.
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
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 :
|
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 :
|
Là tu pourras filer un vrai pointeur.
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.
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. |
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?
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.
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)
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
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"
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?
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"
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
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
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^^
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