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

  FORUM HardWare.fr
  Programmation
  C

  Fonction de saisi avec un nombre de parametre variable

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction de saisi avec un nombre de parametre variable

n°1510450
bad___day
Posté le 03-02-2007 à 15:29:20  profilanswer
 

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
mood
Publicité
Posté le 03-02-2007 à 15:29:20  profilanswer
 

n°1510451
Sve@r
Posté le 03-02-2007 à 15:35:17  profilanswer
 

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.
n°1510456
bad___day
Posté le 03-02-2007 à 15:48:17  profilanswer
 

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
n°1510484
Sve@r
Posté le 03-02-2007 à 18:21:36  profilanswer
 

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.
n°1510944
bad___day
Posté le 05-02-2007 à 15:19:34  profilanswer
 

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
n°1511072
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-02-2007 à 18:20:51  profilanswer
 

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/
n°1511513
bad___day
Posté le 06-02-2007 à 17:44:58  profilanswer
 

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
n°1511519
Emmanuel D​elahaye
C is a sharp tool
Posté le 06-02-2007 à 18:01:27  profilanswer
 

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/
n°1511523
bad___day
Posté le 06-02-2007 à 18:09:52  profilanswer
 

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
n°1511531
Emmanuel D​elahaye
C is a sharp tool
Posté le 06-02-2007 à 18:35:20  profilanswer
 

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/

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

  Fonction de saisi avec un nombre de parametre variable

 

Sujets relatifs
Notice: Undefined Variable [formmail.php]Recuperer une variable XML via PHP
Fonction pour des nombres entiers aleatoires?[Oracle 10.2] PL/SQL Paramètre Curseur
Nombre vers textenombre d'enregistrements limite dans sql
[PHP] Problème de variable de page[Résolu] GDI+ : Fonction Rectangle.Contains()
question sur la fonction fscommand('quit')Nombre d'occurences => toujours besoin d'aide
Plus de sujets relatifs à : Fonction de saisi avec un nombre de parametre variable


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