Fonction de saisi avec un nombre de parametre variable

Fonction de saisi avec un nombre de parametre variable - C - Programmation

Marsh Posté le 03-02-2007 à 15:29:20    

Hello all,
 
J'essaye de faire une fonction de saisi de nombre, qui prend en paramètre le format du nombre a saisir (%d ou %ld ou %lf ou %lu etc..) et un pointeur sur une variable nombre dans la quel saisir.
 
Mais le problème c'est que cette variable peut être de n'importe quel type (long int ou bouble ou unsigned long int ou ...) , alors j'ai ponçais de la mettre comme argument pour ma fonction read_number()  en type (void*) comme suite:
 
int read_number(const char *format, void *number);
 
C'est que je ne sais pas si ça ce fait,  
et surtout que la variable number va être traiter dans plusieurs cas selon le format.
 
Si vous voulez le code source de ce que j'ai fait pour le moment alors voila (mais il est erroner):
 

Code :
  1. // PROBLEME: COMMENT METRE LE RESULTAT DANS number AVEC LE BON FORMAT ?
  2. int read_number(const char *format, void *number)
  3. {
  4.     char* fin = NULL;
  5.     char chaine[50];
  6.     int errorNotNumber = 0;
  7.     restart:
  8.     read_string(chaine, sizeof(chaine)); //fonction de saisi de chaine
  9.     if(strcmp(format,"%ld" )==0 || strcmp(format,"%d" )==0)
  10.     {
  11.         long int *num = number;
  12.         if( (*num = strtol(chaine, &fin, 10)) == 0)
  13.             errorNotNumber = 1;
  14.         //else    number = num; comment faire là ?
  15.     }
  16.     else if(strcmp(format,"%lu" )==0 || strcmp(format,"%u" ))
  17.     {
  18.         unsigned long int *num = number;
  19.         if( (*num = strtoul(chaine, &fin, 10)) == 0)
  20.             errorNotNumber = 1;
  21.         //else    number = num; comment faire là ?
  22.     }
  23.     else if(strcmp(format,"%lf" )==0 || strcmp(format,"%f" )==0)
  24.     {
  25.         double *num = number;
  26.         if( (*num = strtod(chaine, &fin)) == 0)
  27.             errorNotNumber = 1;
  28.         //else    number = num; comment faire là ?
  29.     }
  30.     else
  31.     {
  32.         FILE* error = fopen("error.read_number.txt","w" );
  33.         fputs("Function : read_number() : Error in code format", error);
  34.         fclose(error);
  35.         return 1;
  36.     }
  37.     if(errorNotNumber)
  38.     {
  39.         printf("This is not a number !\n" );
  40.         errorNotNumber = 0;
  41.         goto restart;
  42.     }
  43.     return 0;
  44. }


 
je essayer de regarder dans stdio.h , histoire de voire la fonction scanf() mais il n y a rien d'intéressant.
 
thanks for your help.


Message édité par bad___day le 05-02-2007 à 15:35:25
Reply

Marsh Posté le 03-02-2007 à 15:29:20   

Reply

Marsh Posté le 03-02-2007 à 15:35:17    

Boaf... pourquoi ne pas faire simplement:

Code :
  1. int read_number(const char *format, void *number)
  2. {
  3.     while (sscanf(chaine, format, number) != 1)
  4.         printf("This is not a number\n" );
  5.     return 0;
  6. }


 
???

Message cité 1 fois
Message édité par Sve@r le 03-02-2007 à 15:35:59

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 03-02-2007 à 15:48:17    

Sve@r a écrit :

Boaf... pourquoi ne pas faire simplement: ... sscanf() ...


Je n'avais pas pençais a sscanf() /*pourtant c'est la plus evidante*/  :jap:

 

Mais avec ton code, quand je fait:

Code :
  1. int read_number(const char *format, void *number)
  2. {
  3.     char chaine[50];
  4.     read_string(chaine, sizeof(chaine)); //fonction de saisi de chaine
  5.     while (sscanf(chaine, format, number) != 1)
  6.         printf("This is not a number\n" );
  7.     return 0;
  8. }
 

et qu'a l'appel de read_number() je saisi un caractère différant d'un nombre, sa m'affiche une boucle infinie de "This is not a number\n" !

 

Message cité 1 fois
Message édité par bad___day le 03-02-2007 à 17:59:26
Reply

Marsh Posté le 03-02-2007 à 18:21:36    

bad___day a écrit :

Je n'avais pas pençais a sscanf() /*pourtant c'est la plus evidante*/  :jap:  
 
Mais avec ton code, quand je fait:

Code :
  1. int read_number(const char *format, void *number)
  2. {
  3.     char chaine[50];
  4.     read_string(chaine, sizeof(chaine)); //fonction de saisi de chaine
  5.     while (sscanf(chaine, format, number) != 1)
  6.         printf("This is not a number\n" );
  7.     return 0;
  8. }


 
et qu'a l'appel de read_number() je saisi un caractère différant d'un nombre, sa m'affiche une boucle infinie de "This is not a number\n" !


 
Ben peut-être que si t'incluais la fonction "read_string()" dans le while l'algo te permettrait de re-rentrer autre chose dans la variable "chaine" sinon ta chaine ne change pas !!!
Style "boucle infinie" => saisir chaine => si sscanf(chaine, ..., ...) == 1 break => affichage "pas un nombre" => fin de boucle


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 05-02-2007 à 15:19:34    

Oué cest vraie :) .
Sinon y a t il un moyen de faire une fonction avec un nombre dynamique d'arguments ?
càd: faire une fonction avec un nombre de paramètre variable

Message cité 1 fois
Message édité par bad___day le 05-02-2007 à 15:35:55
Reply

Marsh Posté le 05-02-2007 à 18:20:51    

bad___day a écrit :

Oué cest vraie :) .
Sinon y a t il un moyen de faire une fonction avec un nombre dynamique d'arguments ?
càd: faire une fonction avec un nombre de paramètre variable


Oui : K&R2 Annexe B7 (Page 259).(<stddarg.h> )
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 06-02-2007 à 17:44:58    

Emmanuel Delahaye a écrit :

Oui : K&R2 Annexe B7 (Page 259).(<stddarg.h> )


Ok merci je vais voire ça.
 
Sinon, pour mon premier code, comment je peut faire pour mettre le résultat dans la variable number avec le bon format, si je ne veut pas utiliser sscanf() ?
je pose cette question car je tombe fréquemment sur des problème dans ce genre..
 
NB: Emmanuel Delahaye peut tu me dire stp si mon Code est un code de Goret (si oui, en quoi) ? car on m'a renvoyer sur la page de ton site "l'échelle de Goret" quand j'ai posé la même question sur un autre forum !  :p

Message cité 1 fois
Message édité par bad___day le 06-02-2007 à 17:47:22
Reply

Marsh Posté le 06-02-2007 à 18:01:27    

bad___day a écrit :

Sinon, pour mon premier code, comment je peut faire pour mettre le résultat dans la variable number avec le bon format, si je ne veut pas utiliser sscanf() ?
je pose cette question car je tombe fréquemment sur des problème dans ce genre..


Tu peux préciser quels genre de problèmes ? Souvent, quand une solution est complexe, c'est que le problème est mal posé ou qu'une solution 'en amont' permet de simplifier ...

Citation :

NB: Emmanuel Delahaye peut tu me dire stp si mon Code est un code de Goret (si oui, en quoi) ? car on m'a renvoyer sur la page de ton site "l'échelle de Goret" quand j'ai posé la même question sur un autre forum !  :p

Le goto remontant mérite un niveau 9... Il y a 3 formes de boucles en C...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 06-02-2007 à 18:09:52    

Emmanuel Delahaye a écrit :

Tu peux préciser quels genre de problèmes ?


C'est un exemple concret celui là si la fonction sscanf() n'avais pas exister...
C'est généralement quand je veut mettre en argument une variable que je ne sais pas qu'elle type elle dois prendre au départ... comme là.

Message cité 1 fois
Message édité par bad___day le 06-02-2007 à 18:29:55
Reply

Marsh Posté le 06-02-2007 à 18:35:20    

bad___day a écrit :

C'est un exemple concret celui là si la fonction sscanf() n'avais pas exister...
C'est généralement quand je veut mettre en argument une variable que je ne saisi qu'elle type elle dois prendre au départ... comme là.


La question de la saisie de donnée est de celles qu'on règle une fois pour toutes au début de sa carrière d'informaticien. L'expérience montre qu'avec :  

  • une saisie de ligne (la base)
  • une saisie de caractère
  • une saisie d'entier (long) et éventuellement non signé (unsigned long)
  • une saisie de décimal (double) et éventuellement une saisie de décimal large (long double)

on a fait le tour de la question définitivement en 4 à 6 fonctions.
 
En matière de saisie, il vaut mieux des fonction spécialisées qui vont pouvoir se consacrer aux tests et autres vérifications sans être polluées par d'autres problèmes.
 
Il n'est pas nouveau de constater que scanf() est une usine à gaz...
 
http://mapage.noos.fr/emdel/clib.htm
Module IO


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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