IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Passer un opérateur en paramètre et lire un double ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Par défaut Passer un opérateur en paramètre et lire un double ?
    Bonjour

    J'aurais 2 questions si vous permettez

    J'ai 4 fonctions, la seule chose qui en fait la différence c'est l'opérateur, + - * et /

    Est-ce que c'est possible de ne faire qu'une seule fonction et lui passer l'opérateur en paramètre ?

    Faire un truc du genre: fonction A(operator op, int x) x op = x
    Si on passe + ça ferait x+=x;

    Aussi quelle serait la façon la plus pratique de convertir une chaîne char* en double ? Mais que la fonction puisse me dire si char* est un nombre valide au cas ou mon char* aurait des lettres ou des espaces, etc.

    Merci

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par AsmCode
    J'ai 4 fonctions, la seule chose qui en fait la différence c'est l'opérateur, + - * et /

    Est-ce que c'est possible de ne faire qu'une seule fonction et lui passer l'opérateur en paramètre ?
    Oui bien sûr, l'opérateur peut être stocké dans un type char tout simplement (attention pas un pointeur mais bel et bien un char) puis ensuite il te suffit de faire un switch ... case avec les différents cas qui seront les opérateurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    switch (operateur)
    {
       case '+':
       ...
       case '-':
       ...
       case '*':
       ...
       case '/':
       ...
    }

    Citation Envoyé par AsmCode
    Aussi quelle serait la façon la plus pratique de convertir une chaîne char* en double ? Mais que la fonction puisse me dire si char* est un nombre valide au cas ou mon char* aurait des lettres ou des espaces, etc.
    strtod
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Pour savoir s'il s'agit d'un nombre ou pas tu peux utiliser la fonction isdigit

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 41
    Par défaut
    Tu ne peut pas passer des operateurs en arguements en C, mais tu peut passer des fonctions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    int add(int a, int b){
        return a + b;
    }
     
    int sub(int a, int b){
        return a - b;
    }
     
    int mul(int a, int b){
        return a * b;
    }
     
    int div(int a, int b){
        return a / b;
    }
     
    int fold(int (*f)(int,int), int a, int *list, int size){
        int i;
        for(i = 0; i < size; i++){
            a = f(a,list[i]);
        }
        return a;
    }
     
    int main(){
        int nums[5] = {1,2,3,4,5};
        printf("somme: %d\nproduit: %d\n", fold(add,0,nums,5), fold(mul,1,nums,5));
    }

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par atnnn
    Tu ne peut pas passer des operateurs en arguements en C, mais tu peut passer des fonctions:
    Si tu te prennais la peine de lire au moins les posts tu saurais que justement sont but c'est de n'avoir qu'une seule fonction donc ma solution est bonne à prendre.

    Ce qui donne par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double calcul_double (double operande1, double operande2, char operateur);
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Franck.H
    Si tu te prennais la peine de lire au moins les posts tu saurais que justement sont but c'est de n'avoir qu'une seule fonction donc ma solution est bonne à prendre.

    Ce qui donne par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double calcul_double (double operande1, double operande2, char operateur);
    Sauf que ce n'est pas un "opérateur" au sens strict que l'on passe, ( f(+) n'est pas du C) mais une constante caractère (donc de type int et non char... : f('+') ) qui sert à déterminer quelle opération doit être effectuée.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 41
    Par défaut
    Citation Envoyé par Franck.H
    Si tu te prennais la peine de lire au moins les posts tu saurais que justement sont but c'est de n'avoir qu'une seule fonction donc ma solution est bonne à prendre.

    Ce qui donne par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double calcul_double (double operande1, double operande2, char operateur);
    Si ce n'est qu'une seule fonction qu'il faut, alors il faudrait prendre par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double A(double (*op)(double,double), double *x){
        return *x = op(*x,*x);
    }
    Le but de ne faire qu'une seule fonction est de reduire la taille du code, de ne pas repeter le meme code plusieurs fois et de faciliter la reutilisation du code. Avec un switch, il faut modifier la fonction chaque fois que l'ont veut rajouter un operateur, mais si on ne fait que passer la fonction en parametre, il suffit de lui passer une autre fonction.

    Malheureusement, le C ne supporte pas entierement le polymorphisme, les fonctions anonymes et la programmation orientee object, mais il faut quand utiliser les abstractions disponibles.

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/10/2014, 16h08
  2. [C#] Passer un dataset en paramètre dans un WinForm enfant
    Par iDaaX dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/01/2005, 21h55
  3. [Conception] Passer une fonction en paramètre
    Par pejay dans le forum Langage
    Réponses: 9
    Dernier message: 09/12/2004, 13h58
  4. passer un champ en paramètre, c'est possible ??
    Par marie253 dans le forum Bases de données
    Réponses: 6
    Dernier message: 09/07/2004, 09h22
  5. Passer une procédure en paramètre ?
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2003, 12h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo