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

  FORUM HardWare.fr
  Programmation
  C++

  question atoi

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

question atoi

n°183655
picshertho
Posté le 26-07-2002 à 15:15:39  profilanswer
 

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

mood
Publicité
Posté le 26-07-2002 à 15:15:39  profilanswer
 

n°183656
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 15:17:41  profilanswer
 

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.


---------------
Le Tyran
n°183657
velleronna​is
Posté le 26-07-2002 à 15:19:25  profilanswer
 

char toto[20];
int  titi = atoi(toto);

n°183660
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 15:22:50  profilanswer
 

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.


Message édité par LetoII le 26-07-2002 à 15:23:29

---------------
Le Tyran
n°183687
picshertho
Posté le 26-07-2002 à 15:46:09  profilanswer
 

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"

n°183690
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 15:48:20  profilanswer
 

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?


---------------
Le Tyran
n°183699
picshertho
Posté le 26-07-2002 à 15:58:00  profilanswer
 

comme ca :
 
char* saisie = "truc bonjour 69" ;

n°183705
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 16:00:34  profilanswer
 

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


Message édité par LetoII le 26-07-2002 à 16:01:32

---------------
Le Tyran
n°183706
picshertho
Posté le 26-07-2002 à 16:00:49  profilanswer
 

au secours j y suis depuis 8 heures

n°183712
picshertho
Posté le 26-07-2002 à 16:03:56  profilanswer
 

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) ;  

mood
Publicité
Posté le 26-07-2002 à 16:03:56  profilanswer
 

n°183713
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 16:05:13  profilanswer
 

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...  :sarcastic:


---------------
Le Tyran
n°183719
picshertho
Posté le 26-07-2002 à 16:10:49  profilanswer
 

// 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 ;
 
}

n°183721
picshertho
Posté le 26-07-2002 à 16:12:04  profilanswer
 

en fait pour la lecture de la chaine de caractere sa marche mais des que j arrive a 69 ca plante

n°183722
picshertho
Posté le 26-07-2002 à 16:13:01  profilanswer
 

putin les gars si vous arrivez a trouver le probleme vous etes des gros balezes

n°183727
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 16:19:45  profilanswer
 

picshertho a écrit a écrit :

// CallFunction permet d appeler une fonction disponible  

Code :
  1. bool Interpreter::CallFunction (FunctionDispo FDispo,list <char*> &LisCom) {
  2. // Declarer 4 variables dont l adresse sera pointee par le champ data de Param
  3. bool* Varbool = new bool ;
  4. int* Valentier = new int ;
  5. float* Valfloat = new float ;
  6. char* Valchain ;
  7. //int uiuiu = FDispo.Params.size() ;
  8. list<Param>::iterator ItParam ;
  9. list<char*>::iterator ItLisCom = LisCom.begin() ;
  10. // Transformer la valeur de *ItLisCom en fonction du type de ItParam
  11. // Ensuite affecter cette valeur dans une des variables déclarées localement
  12. // Enfin affecter au champ data de ItParam l adresse de la variable locale ci dessus
  13. for (ItParam = FDispo.Params.begin(), ++ItLisCom ;
  14.    ((ItParam != FDispo.Params.end()) &&  (ItLisCom != LisCom.end())) ;
  15.    ++ItParam, ++ItLisCom) {
  16.  // On utilise l instruction du switch pour plus de commodite
  17.  // Chaque case represente la valeur en entier d un type
  18. char* sdf = new char [strlen(*ItLisCom)] ;
  19. strcpy (sdf, *ItLisCom) ;
  20.   
  21.  switch (ItParam->Type) {
  22.   case CONSOLE_BOOLEEN :
  23.    if (*ItLisCom == "true" ) {
  24.     *Varbool = true ;
  25.     ItParam->data = Varbool ;
  26.     break ;
  27.    }
  28.    else {
  29.     *Varbool = false ;
  30.     ItParam->data = Varbool ;
  31.     break ;
  32.    }
  33.   case CONSOLE_INT :
  34.    *Valentier = atoi(*ItLisCom) ;
  35.    ItParam->data = Valentier ;
  36.    break ;
  37.   case CONSOLE_FLOAT :
  38.    *Valfloat = atof(*ItLisCom) ;
  39.    ItParam->data = Valfloat ;
  40.    break ;
  41.   case CONSOLE_STRING :
  42.    Valchain = new char [strlen(*ItLisCom)] ;
  43.    strcpy (Valchain, *ItLisCom) ;
  44.    ItParam->data = Valchain ;
  45.    break ;
  46.   default :
  47.    // Si le type est inconnu on sort de la fonction
  48.    return false ;
  49.  } // Fin du switch
  50. } // Fin du for
  51. // Si l on est sorti de la boucle c est que toutes les valeurs des parametres de la fonction  
  52. // ont ete initialisees et on peut enfin appeler la fonction disponible
  53. FDispo.PointerFunction(&FDispo.Params) ;
  54. //  desallouer les variables mais est ce ici necessaire ??
  55. // Cas ou la fonction est executee
  56. return true ;
  57. }






Code :
  1. char* sdf = new char [strlen(*ItLisCom)+1] ;


 
c mieux ;)
Bon ça vient pas de là le pb mais bon :)


---------------
Le Tyran
n°183728
picshertho
Posté le 26-07-2002 à 16:21:35  profilanswer
 

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 ?  

n°183729
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 16:21:38  profilanswer
 

ItParam = FDispo.Params.begin(), ++ItLisCom ;
 
Il fait quoi là c ++ItLisCom ?


---------------
Le Tyran
n°183731
picshertho
Posté le 26-07-2002 à 16:23:59  profilanswer
 

bon je vois pas ce que ca change en tout cas

n°183732
picshertho
Posté le 26-07-2002 à 16:26:00  profilanswer
 

++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
 

n°183733
picshertho
Posté le 26-07-2002 à 16:29:16  profilanswer
 

FDispo.Param.begin() c est une autre liste en fait je fais defiler 2 iterateurs en meme temps c est pour ca

n°183734
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 16:29:26  profilanswer
 

Et ta liste de pointeur tu l'initialise comment?


---------------
Le Tyran
n°183736
picshertho
Posté le 26-07-2002 à 16:30:46  profilanswer
 

quelle liste de pointeur ?
je comprends pas  :(

n°183738
picshertho
Posté le 26-07-2002 à 16:35:04  profilanswer
 

bon beh merci qd meme les gars
j ai l impression que je men sortirai jamais... :sweat:

n°183739
picshertho
Posté le 26-07-2002 à 16:37:28  profilanswer
 

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 ?  

n°183741
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 16:38:54  profilanswer
 

la liste que tu passe à ta fonction : list <char*> &LisCom
 
Tu doit bien l'initialiser avant, non?


---------------
Le Tyran
n°183743
picshertho
Posté le 26-07-2002 à 16:42:51  profilanswer
 

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)) ;

n°183750
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 16:47:24  profilanswer
 

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.


---------------
Le Tyran
n°183784
picshertho
Posté le 26-07-2002 à 17:07:46  profilanswer
 

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)"
 

n°183786
picshertho
Posté le 26-07-2002 à 17:15:00  profilanswer
 

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

n°183857
LetoII
Le dormeur doit se réveiller
Posté le 26-07-2002 à 19:01:11  profilanswer
 

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)


---------------
Le Tyran
n°183986
tanguy
Posté le 26-07-2002 à 22:44:47  profilanswer
 

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.

n°184637
Musaran
Cerveaulté
Posté le 28-07-2002 à 03:47:51  profilanswer
 

"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 :
  1. list <char*> LisCom ;
  2. int ChainLen= strlen(Chain) ;
  3. int i = 0 ;
  4. do {
  5. int j= 0 ;
  6. char* Tab= new char[ChainLen+1] ;
  7. while( !isspace(Chain[i]) && Chain[i]!='\0' )//copier jusqu'à espace ou fin
  8.  Tab[j++]= Chain[i++] ;
  9. Tab[j]= '\0' ;
  10. LisCom.push_back(Tab) ;
  11. }
  12. while (++i <= ChainLen) ;
Code :
  1. bool Interpreter::CallFunction (FunctionDispo FDispo,list <char*> &LisCom) {
  2. for((FDispo.Params)::iterator ItParam =  FDispo.Params.begin() ,//init1
  3.    LisCom        ::iterator ItLisCom= &LisCom[1]             ;//init2           
  4.     ItParam!=FDispo.Params.end() && ItLisCom!=LisCom.end()     ;//test
  5.   ++ItParam, ++ItLisCom)
  6. {
  7.       int ComSize = strlen(*ItLisCom)+1 ;
  8.  char* sdf = new char[ComSize] ;
  9.       strcpy(sdf, *ItLisCom) ;
  10.  switch (ItParam->Type) {
  11.   case CONSOLE_BOOLEEN: ItParam->data= new bool (!strcmp(*ItLisCom,"true" )) ; break ;
  12.   case CONSOLE_INT    : ItParam->data= new int  (atoi(*ItLisCom)          ) ; break ;
  13.   case CONSOLE_FLOAT  : ItParam->data= new float(atof(*ItLisCom)          ) ; break ;
  14.   case CONSOLE_STRING : ItParam->data= new char [ComSize] ;
  15.                         strcpy(ItParam->data, *ItLisCom) ;                  ; break ;
  16.   default : return false ;
  17.  }
  18. }
  19. FDispo.PointerFunction(&FDispo.Params) ;
  20. //si le ItParam->data actuel n'a plus d'emploi, ceci est nécessaire !
  21. if(ItParam->Type == CONSOLE_STRING) delete[] ItParam->data ; //à cause du new[]
  22. else                                delete   ItParam->data ;
  23. return true ;
  24. }


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°185022
velleronna​is
Posté le 29-07-2002 à 10:21:26  profilanswer
 

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 !!!

n°185023
picshertho
Posté le 29-07-2002 à 10:22:29  profilanswer
 

j ai du mal a vous suivre la

n°185038
LetoII
Le dormeur doit se réveiller
Posté le 29-07-2002 à 10:45:43  profilanswer
 

velleronnais a écrit a écrit :

 
 
Bien evidemment !!!




 
Ben ouai mais quand on donne un exemple c bien d'en mettre un qui montre quelquechose...


---------------
Le Tyran
n°185092
velleronna​is
Posté le 29-07-2002 à 11:48:34  profilanswer
 

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...

n°185324
LetoII
Le dormeur doit se réveiller
Posté le 29-07-2002 à 15:11:13  profilanswer
 

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 :ange: :D


---------------
Le Tyran
n°185440
velleronna​is
Posté le 29-07-2002 à 16:37:59  profilanswer
 

letoII a écrit a écrit :

 
 
Vu les poste qui ont suivi je crois que ça l'était pas :ange: :D




 
aux temps pour moi ! :jap:

mood
Publicité
Posté le   profilanswer
 


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

  question atoi

 

Sujets relatifs
question de fonction ???Question simple pour les connaisseurs
question avec les forums phpbb2Question de debutant [edit] : Sous Outlook
re-question de newbie :c quoi une classe?question de newbie : a quoi sert la fonction break?
Pitite question !!!voir le XML question toute conne, pour visualiser ss passer par saxon
[question] a ceux qui bossent dans l info sur paris[java] question sur les threads
Plus de sujets relatifs à : question atoi


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