question atoi

question atoi - C++ - Programmation

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

Reply

Marsh Posté le 26-07-2002 à 15:15:39   

Reply

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.


---------------
Le Tyran
Reply

Marsh Posté le 26-07-2002 à 15:19:25    

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

Reply

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.


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

---------------
Le Tyran
Reply

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"

Reply

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?


---------------
Le Tyran
Reply

Marsh Posté le 26-07-2002 à 15:58:00    

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

Reply

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


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

---------------
Le Tyran
Reply

Marsh Posté le 26-07-2002 à 16:00:49    

au secours j y suis depuis 8 heures

Reply

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

Reply

Marsh Posté le 26-07-2002 à 16:03:56   

Reply

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


---------------
Le Tyran
Reply

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

Reply

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

Reply

Marsh Posté le 26-07-2002 à 16:13:01    

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

Reply

Marsh Posté le 26-07-2002 à 16:19:45    

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
Reply

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 ?  

Reply

Marsh Posté le 26-07-2002 à 16:21:38    

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


---------------
Le Tyran
Reply

Marsh Posté le 26-07-2002 à 16:23:59    

bon je vois pas ce que ca change en tout cas

Reply

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
 

Reply

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

Reply

Marsh Posté le 26-07-2002 à 16:29:26    

Et ta liste de pointeur tu l'initialise comment?


---------------
Le Tyran
Reply

Marsh Posté le 26-07-2002 à 16:30:46    

quelle liste de pointeur ?
je comprends pas  :(

Reply

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

Reply

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 ?  

Reply

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?


---------------
Le Tyran
Reply

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

Reply

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.


---------------
Le Tyran
Reply

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

Reply

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

Reply

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)


---------------
Le Tyran
Reply

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.

Reply

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 :
  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
Reply

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

Reply

Marsh Posté le 29-07-2002 à 10:22:29    

j ai du mal a vous suivre la

Reply

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


---------------
Le Tyran
Reply

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

Reply

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


---------------
Le Tyran
Reply

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




 
aux temps pour moi ! :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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