question atoi - C++ - Programmation
Marsh Posté le 26-07-2002 à 15:17:41
picshertho a écrit a écrit : je comprends pas je veux convertir une chaine en entier ac la fonction atoi et il me renvoie la valeur 0 signifiant qu il ne peut pas convertir..pouvez vous m'aider ? case CONSOLE_INT : *Valentier = atoi(*ItLisCom) ; ItParam->data = Valentier ; break ; *ItLisCom est un char* valentier est un pointeur sur un entier |
Ben je sais pas moi, regarde ce que t'as dans ta chaîne§. atoi s'arréte dès qu'elle rencontre un caractère ne numèrique.
Marsh Posté le 26-07-2002 à 15:22:50
velleronnais a écrit a écrit : char toto[20]; int titi = atoi(toto); |
Bon ben là ça fait tjrs 0. En tout cas en mode debug. T'as chaine est pleine de caractaire '\0' donc vide. Met un chifre dedans et ça marchera.
Marsh Posté le 26-07-2002 à 15:46:09
mais le pbleme c est que ma chaine a pour valeur 65 et il me renvoie 0
le prolbleme vient du fait que bien que ma chaine es "65" le comppil lit en "|ùA"
Marsh Posté le 26-07-2002 à 15:48:20
picshertho a écrit a écrit : mais le pbleme c est que ma chaine a pour valeur 65 et il me renvoie 0 le prolbleme vient du fait que bien que ma chaine es "65" le comppil lit en "|ùA" |
Et t'as fait comment pour mettre 65 dedans?
Marsh Posté le 26-07-2002 à 16:00:34
picshertho a écrit a écrit : comme ca : char* saisie = "truc bonjour 69" ; |
et t'as fait atoi(saisie) ? c ça?
au fait comme on l'a dit dans un autre poste ça c pas propre, char saisie[] = "truc bonjour 69" ; c mieux
Marsh Posté le 26-07-2002 à 16:03:56
non c plus compliqué
en fait j ai une liste de char* avec trois cellules :
"truc"
"bonjour"
"69"
ensuite avec un iterateur ItLisCom, lorsque je suis rendu a "69"
je fais :
*Valentier = atoi(*ItLisCom) ;
Marsh Posté le 26-07-2002 à 16:05:13
picshertho a écrit a écrit : non c plus compliqué en fait j ai une liste de char* avec trois cellules : "truc" "bonjour" "69" ensuite avec un iterateur ItLisCom, lorsque je suis rendu a "69" je fais : *Valentier = atoi(*ItLisCom) ; |
Ben met tout ton code on pourra^peut être t'aider...
Marsh Posté le 26-07-2002 à 16:10:49
// CallFunction permet d appeler une fonction disponible
bool Interpreter::CallFunction (FunctionDispo FDispo,list <char*> &LisCom) {
// Declarer 4 variables dont l adresse sera pointee par le champ data de Param
bool* Varbool = new bool ;
int* Valentier = new int ;
float* Valfloat = new float ;
char* Valchain ;
//int uiuiu = FDispo.Params.size() ;
list<Param>::iterator ItParam ;
list<char*>::iterator ItLisCom = LisCom.begin() ;
// Transformer la valeur de *ItLisCom en fonction du type de ItParam
// Ensuite affecter cette valeur dans une des variables déclarées localement
// Enfin affecter au champ data de ItParam l adresse de la variable locale ci dessus
for (ItParam = FDispo.Params.begin(), ++ItLisCom ;
((ItParam != FDispo.Params.end()) && (ItLisCom != LisCom.end())) ;
++ItParam, ++ItLisCom) {
// On utilise l instruction du switch pour plus de commodite
// Chaque case represente la valeur en entier d un type
char* sdf = new char [strlen(*ItLisCom)] ;
strcpy (sdf, *ItLisCom) ;
switch (ItParam->Type) {
case CONSOLE_BOOLEEN :
if (*ItLisCom == "true" ) {
*Varbool = true ;
ItParam->data = Varbool ;
break ;
}
else {
*Varbool = false ;
ItParam->data = Varbool ;
break ;
}
case CONSOLE_INT :
*Valentier = atoi(*ItLisCom) ;
ItParam->data = Valentier ;
break ;
case CONSOLE_FLOAT :
*Valfloat = atof(*ItLisCom) ;
ItParam->data = Valfloat ;
break ;
case CONSOLE_STRING :
Valchain = new char [strlen(*ItLisCom)] ;
strcpy (Valchain, *ItLisCom) ;
ItParam->data = Valchain ;
break ;
default :
// Si le type est inconnu on sort de la fonction
return false ;
} // Fin du switch
} // Fin du for
// Si l on est sorti de la boucle c est que toutes les valeurs des parametres de la fonction
// ont ete initialisees et on peut enfin appeler la fonction disponible
FDispo.PointerFunction(&FDispo.Params) ;
// desallouer les variables mais est ce ici necessaire ??
// Cas ou la fonction est executee
return true ;
}
Marsh Posté le 26-07-2002 à 16:12:04
en fait pour la lecture de la chaine de caractere sa marche mais des que j arrive a 69 ca plante
Marsh Posté le 26-07-2002 à 16:13:01
putin les gars si vous arrivez a trouver le probleme vous etes des gros balezes
Marsh Posté le 26-07-2002 à 16:19:45
picshertho a écrit a écrit : // CallFunction permet d appeler une fonction disponible
|
Code :
|
c mieux
Bon ça vient pas de là le pb mais bon
Marsh Posté le 26-07-2002 à 16:21:35
merci j essaye
et comment je fais pour atteindre une cellule de ma liste sana passer par un iterateur c est possible ?
je connais le .front() .back()
mais je vois pas pour acceder a la cellule courante
comment fais ton pour acceder a la cellule courante ?
Marsh Posté le 26-07-2002 à 16:21:38
ItParam = FDispo.Params.begin(), ++ItLisCom ;
Il fait quoi là c ++ItLisCom ?
Marsh Posté le 26-07-2002 à 16:26:00
++ItLisCom me permet de commencer l iterateur non pas au premier mot mais au deuxieme
le premeir j en veux pas car c est le nom de commande
Marsh Posté le 26-07-2002 à 16:29:16
FDispo.Param.begin() c est une autre liste en fait je fais defiler 2 iterateurs en meme temps c est pour ca
Marsh Posté le 26-07-2002 à 16:29:26
Et ta liste de pointeur tu l'initialise comment?
Marsh Posté le 26-07-2002 à 16:35:04
bon beh merci qd meme les gars
j ai l impression que je men sortirai jamais...
Marsh Posté le 26-07-2002 à 16:37:28
mais alors t a s combien d annee d expe derriere toi LetoII ?
et comment je fais pour atteindre une cellule de ma liste sana passer par un iterateur c est possible ?
je connais le .front() .back()
mais je vois pas pour acceder a la cellule courante
comment fais ton pour acceder a la cellule courante ?
Marsh Posté le 26-07-2002 à 16:38:54
la liste que tu passe à ta fonction : list <char*> &LisCom
Tu doit bien l'initialiser avant, non?
Marsh Posté le 26-07-2002 à 16:42:51
voila :
list <char*> LisCom ;
char* Tab ;
// Compteur de Tab
int j = 0 ;
// Compteur du parametre Chain
int i = 0 ;
do {
// Allouer Tab dynamyquement
Tab = new char[strlen(Chain)] ;
// Jusqu a ce que j ai un espace ou un retour chariot ou un saut de page
while (!isspace(Chain[i]) && Chain[i] != '\0' {
// Copier les caracteres
Tab[j] = Chain[i] ;
i++ ;
j++ ;
}
// Terminer la chaine Tab par le retour chariot
Tab[j] = '\0' ;
// Inserer la commande et les parametres dans LisCom
char* NewCom ;
NewCom = Tab ;
LisCom.push_back(NewCom) ;
// Passer au caractere suivant de la chaine Chain
i++ ;
// Reinitialiser Tab
j = 0 ;
}
while (i <= strlen(Chain)) ;
Marsh Posté le 26-07-2002 à 16:47:24
bon alors dèjà t'as strtok sui te partitionne ta chaîne (c dans string.h) ensuite quand tu alloue de la place pour une chaine tjrs faire new char[strlen(chaineACopier)+1] pour laisser de la place pour le 0 terminal.
Alors tu refais ton code avec ça et on en reparle.
Marsh Posté le 26-07-2002 à 17:07:46
ca y est
j ai reallouer par contre j ai pas compris :
"t'as strtok sui te partitionne ta chaîne (c dans string.h)"
Marsh Posté le 26-07-2002 à 17:15:00
et bien ca y est j ai trouve lerreur
elle etait pas dans la fonction call function mais dans la fonction qui appelle cette derniere
en fait j avais desallouer Tab avant d appeler la fonction callfunciton donc la derniere valeur "69" etait effacée
t as compris ?
en tout cas merci
tu m as toujours pas dis ce que tu fais
Marsh Posté le 26-07-2002 à 19:01:11
Je suis éléve ingénieur en informatique (2eme année)
si non strtok est une petite fonctino bien sympatique des librairies standard du C. Elle permet de parcourir des enregistrements séparés par des caractère précis (par exemple un espace)
Marsh Posté le 26-07-2002 à 22:44:47
LetoII a écrit a écrit : Je suis éléve ingénieur en sinon strtok est une petite fonctino bien sympatique des librairies standard du C. Elle permet de parcourir des enregistrements séparés par des caractère précis (par exemple un espace) |
strtok est certainement bien pratique mais souffre d'un design plutot douteux.
strtok utilise un static qui empeche son utilisation dans les programmes multithread et je crois qu'il y a d'autres merdes.
pour revenir au sujet, pourquoi encore utiliser les char * en C++ ?
le char * c'est à banir, ca pose que des problèmes et ca génère pleins de bugs, de fuites mémoires et ca augmente le temps de développement !
pour moi utiliser char * (en dehors des const char *) à la place de string, c'est aussi grave que de faire des classes avec tout en public.
string c'est beaucoup plus puissant et intuitif et ca résoud bon nombres de problèmes.
pour décomposer une string t'as les iostreams pour faire ca.
Marsh Posté le 28-07-2002 à 03:47:51
"LisCom[n]" pour un accès direct à un élément (enfin je crois).
Rappel: (*ItLisCom == "true" ) compare juste l'adresse de deux chaînes.
Voici comment j'aurais écrit ton code:
(je n'ai pas pu verifier puisque je n'ai pas tout)
Code :
|
Code :
|
Marsh Posté le 29-07-2002 à 10:21:26
letoII a écrit a écrit : Bon ben là ça fait tjrs 0. En tout cas en mode debug. T'as chaine est pleine de caractaire '\0' donc vide. Met un chifre dedans et ça marchera. |
Bien evidemment !!!
Marsh Posté le 29-07-2002 à 10:45:43
velleronnais a écrit a écrit : Bien evidemment !!! |
Ben ouai mais quand on donne un exemple c bien d'en mettre un qui montre quelquechose...
Marsh Posté le 29-07-2002 à 11:48:34
letoII a écrit a écrit : Ben ouai mais quand on donne un exemple c bien d'en mettre un qui montre quelquechose... |
oui, mea culpa... mais ca me semblais evident...
Marsh Posté le 29-07-2002 à 15:11:13
velleronnais a écrit a écrit : oui, mea culpa... mais ca me semblais evident... |
Vu les poste qui ont suivi je crois que ça l'était pas
Marsh Posté le 29-07-2002 à 16:37:59
letoII a écrit a écrit : Vu les poste qui ont suivi je crois que ça l'était pas |
aux temps pour moi !
Marsh Posté le 26-07-2002 à 15:15:39
je comprends pas je veux convertir une chaine en entier ac la fonction atoi et il me renvoie la valeur 0 signifiant qu il ne peut pas convertir..pouvez vous m'aider ?
case CONSOLE_INT :
*Valentier = atoi(*ItLisCom) ;
ItParam->data = Valentier ;
break ;
*ItLisCom est un char*
valentier est un pointeur sur un entier