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 :

Pointeur vers un opérateur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 72
    Par défaut Pointeur vers un opérateur
    Bonjour,

    je me demandais s'il est possible de créer des pointeurs vers les opérateurs > et < en C/C++ (inférieur à et supérieur à) ?

    Attention, je ne parle pas des opérateurs d'une classe qui sont faciles à surcharger, mais des opérateurs de base... (d'ou mon post dans la catégorie C )

    J'ai essayé un bool (*p)(double, double) sans succès...

    Une idée ?

    Xav

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu pourrais éclaircir la question stp

    Ce que tu as fait en faisant bool (*p)(double, double) est un pointeur de fonction

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    je me demandais s'il est possible de créer des pointeurs vers les opérateurs > et <
    Ceci n'a pas de sens en C.

    Attention, je ne parle pas des opérateurs d'une classe qui sont faciles à surcharger, mais des opérateurs de base
    On ne peut faire aucune surcharge d'opérateurs en C

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 72
    Par défaut
    Mmmmh, le C vient de s'effondrer dans mon estime...

    Je détaille mon problème au cas ou ça vous donnerait des idées:

    J'ai une fonction qui réalise plusieurs comparaisons en fonction d'un paramètre type :
    Si type=1 toutes les comparaisons sont des <
    Si type=2 toutes les comparaisons sont des >

    Et je n'ai pas envie d'écrire une fonction par cas, ni de tester le paramète type avant chaque comparaison !

    Du coup je pense à utiliser une variable (un pointeur ?), référencant l'operateur à utiliser et remplacer tout appel à un des deux opérateur par le contenu de cette variable...

    Pour l'instant j'ai créé deux fonctions sup et inf qui encapsulent respectivement > et < mais je trouve ça ridicule...

    il doit bien exister une solution élégante en C ??

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Elégante, je ne vois pas trop.
    Peux être une possibilité dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int inf(void * a, void * b)  { return *(int*)a < *(int*) b;}
    int sup(void * a, void * b) {  return *(double*)a > *(double*) b;}
     
       typedef int (*cmpfct)(void*, void*);
       cmpfct Compare [3] = {NULL, inf, sup};
    //....
       result= Compare[type](&val1,&val2);
    //....

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 517
    Par défaut
    Citation Envoyé par systemofaxav Voir le message
    Mmmmh, le C vient de s'effondrer dans mon estime...
    Si tu arrives à un point où le C est trop limité pour implémenter ton algorithme, c'est qu'il y a fort probablement une erreur de conception quelque part.

    Je détaille mon problème au cas ou ça vous donnerait des idées:
    Bonne idée (il aurait peut-être même fallu commencer par cela ).

    J'ai une fonction qui réalise plusieurs comparaisons en fonction d'un paramètre type :
    Si type=1 toutes les comparaisons sont des <
    Si type=2 toutes les comparaisons sont des >

    Et je n'ai pas envie d'écrire une fonction par cas, ni de tester le paramète type avant chaque comparaison !

    Du coup je pense à utiliser une variable (un pointeur ?), référencant l'operateur à utiliser et remplacer tout appel à un des deux opérateur par le contenu de cette variable...

    Pour l'instant j'ai créé deux fonctions sup et inf qui encapsulent respectivement > et < mais je trouve ça ridicule...
    Non, cela n'est pas ridicule : cela correspond à une réalité technique. Les opérateurs de comparaison, en C, ne sont en pratique jamais compilés comme des appels de fonctions. Il existe en assembleur des instructions de comparaison des binaires (CMP, FCMP, ...) qui modifient l'état des flags du processeur. Les sauts conditionnels se font ensuite suivant l'état de ces flags. Tu peux voir cela comme une sorte de fonction inline qui, en plus, ne contiendrait que deux instructions, voire une.

    Donc, pas de routine en mémoire → pas de pointeur.

    La surcharge des opérateurs est bien pratique pour faire abstraction de tout cela et rendre comparable des choses qui ne le sont pas a priori, mais il faut quand même savoir un peu comment ça se passe sous le capot, de temps en temps.

    il doit bien exister une solution élégante en C ??
    Le plus élégant, à mon avis, est de faire un tableau de pointeurs de fonctions qui soit indexé par ton « type ». Ainsi, tu conserves sup et inf, mais tu peux les faire varier au cours du temps, tu peux étendre ton tableau au besoin, et l'accès à la bonne fonction de comparaison se fait en temps constant, et sans avoir besoin d'être codée en dur dans ton code.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 42
    Par défaut
    Salut,
    pourquoi tu ne fais pas pour tous les cas < et quand tu veux supérieur, tu fait l'inverse du return de ta fonction < ?
    a+,

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 517
    Par défaut
    Citation Envoyé par Bbaboulinet Voir le message
    Salut,
    pourquoi tu ne fais pas pour tous les cas < et quand tu veux supérieur, tu fait l'inverse du return de ta fonction < ?
    a+,
    Parce qu'il faut tenir compte de l'égalité, en plus : « < » ≠ « ≤ » ≠ « = » ≠ « ≥ » ≠ « > ».

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 72
    Par défaut
    Citation Envoyé par Obsidian
    (cf posts ci-dessus)
    Merci pour ta réponse claire et très précise !

    Après reflexion c'est logique de ne pas alourdir l'execution du programme avec des appels de fonctions pour des opérations aussi atomiques que la comparaison...

    Je vais donc conserver inf et sup, un tableau serait de trop ici, puisqu'une fois le type connu, l'operateur de comparaison utilisé est fixe (D'ou un test au début)

    Citation Envoyé par Obsidian
    Salut,
    pourquoi tu ne fais pas pour tous les cas < et quand tu veux supérieur, tu fait l'inverse du return de ta fonction < ?
    a+,
    Parce qu'il faut tenir compte de l'égalité, en plus : « < » ≠ « ≤ » ≠ « = » ≠ « ≥ » ≠ « > ».
    Et d'autant plus que ma fonction ne retourne pas de booléen, mais utilise les comparaisons pour son traitement.

    Merci encore à ceux qui m'ont éclairé !

    __________________

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 517
    Par défaut
    Citation Envoyé par systemofaxav Voir le message
    Après reflexion c'est logique de ne pas alourdir l'execution du programme avec des appels de fonctions pour des opérations aussi atomiques que la comparaison...
    À la limite, si ce sont là les seules opérations que tu as réellement besoin de faire, tu peux utiliser une macro et l'opérateur ternaire :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    #define cmp(a,b,type) type==1?a>b:a<b

    Si le type est connu à la compilation, le C simplifiera l'expression et utilisera directement le bon opérateur, sinon l'overhead engendré ne sera pas plus important que l'appel à une fonction, je pense.

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    À la limite, si ce sont là les seules opérations que tu as réellement besoin de faire, tu peux utiliser une macro et l'opérateur ternaire :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    #define cmp(a,b,type) type==1?a>b:a<b

    Si le type est connu à la compilation, le C simplifiera l'expression et utilisera directement le bon opérateur, sinon l'overhead engendré ne sera pas plus important que l'appel à une fonction, je pense.
    Attention! Macro sans parenthèses détectée!
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    #define cmp(a,b,type) ((type)==1 ? ((a)>(b)) : ((a)<(b)))
    Au moins, on dirait qu'il n'y a pas de problème de double-évaluation possible (contrairement aux macros min et max).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 20h54
  2. convertion pointeur vers tableau
    Par gdpasmini dans le forum C++
    Réponses: 2
    Dernier message: 30/03/2006, 01h34
  3. Réponses: 12
    Dernier message: 31/12/2005, 17h01
  4. Pointeur vers fonction
    Par flopaname dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2005, 16h46
  5. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 01h43

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