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 pointeur const à une fonction


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Par défaut Passer un pointeur const à une fonction
    Bonjour,

    Je ne suis pas à l'aise avec les const.

    Je voudrais passer un pointeur à une fonction, ce pointeur ni sont contenu n'est const . En revanche ni le pointeur ni son contenu ne sera modifié par la fonction.

    Est ce que c'est possible? Comment je dois m'y prendre pour le déclarer?

    Si je fais ça, ça coince:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //fichier.h
     
    void setInputMdl(const float* const);
     
    //fichier.c
     
    float *ipMdl;
     
    void  setInputMdl(const float*ptr const)
        {
            ipMdl = ptr;
        }

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float *ipMdl;
    void  setInputMdl(const float* const ptr)
    {
       ipMdl = ptr;
    }
    De toute façon, le pointeur passé en argument ne peut être modifié, que le paramètre ptr soit déclaré const ou pas. Le déclarer const fait que la variable locale ptr ne peut être modifiée dans la fonction.

    Le compilateur devrait également émettre un warning (que ptr soit déclaré const ou pas), les types de ipMdl (float *) et ptr (const float *) étant différents.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Par défaut
    Je comprends votre explication à propos de la nature constante du pointeur local. Je ne vais donc pas déclarer de const float* car je veux pouvoir ré-initialiser mon pointeur ipMdl au cours du temps.

    Comment spécifier en revanche, que le contenu de mon pointeur ne sera pas modifié par le fonction?

    Est ce seulement possible dans la mesure ou je veux pouvoir passer des pointeurs dont le contenu est éditable.
    (les données ne serait constantes que dans la seule fonction)

    En d'autres termes, est ce que la "portée" de la nature constante d'une donnée peut être localisée (à une fonction) ou doit elle être la même en tout point du programme?

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Dans ton cas il faudrait caster :

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Par défaut
    Le fond du problème pour moi est le suivant:

    Je développe des dll qui seront utilisées par différentes applications.

    La plupart des fonctions exportées ne font que passer des pointeurs vers des tableau de données.

    Ces données ne sont que des données destinées à alimenter un algo et ne sont pas modifiées par les fonctions de la dll.

    Comment écrire proprement le prototype de mes fonctions exportées pour que ce fonctionnement soit explicite sans commentaire à la seule lecture du fichier .h associé à ma dll?

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Si les données passées en argument ne sont vraiment jamais modifiées par ta lib, pourquoi ne déclares-tu pas ipMdl en tant que const ?

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Par défaut
    Je veux, au cours d'une exe, appliquer l'algo contenu dans ma dll à différentes sources de données en passant différents pointeurs à ma dll. Si je déclare ipMdl constant, je ne pourrais l'initialiser qu'une fois (non?)

    Je m'acharne peut être à faire à qqchose qui n'a ni sens ni intérêt.

    Je veux faire ça après m'être inspiré de la lib Qt, ex :
    http://qt.developpez.com/doc/latest/....html#inherits

    Dans cette lib, la plupart des paramètres sont passés en référence constante.

    Dans mon cas j'exporte mes fonctions en C, donc pas de référence mais j’essaie de l'appliquer aux pointeurs.

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Non tu confonds deux choses. Un pointeur const T * peut être setté autant de fois que tu le souhaites. Ce qu'on ne peut pas modifier c'est la donnée pointée par le pointeur, pas le pointeur lui-même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const T * p;
    T const * p;
    sont deux syntaxes équivalentes qui veulent dire que *p (la cible du pointeur) ne peut pas être modifié. Par contre p (le pointeur) peut être modifié.

    veux dire que p (le pointeur lui-même) ne peut pas être modifié. Par contre *p (la "cible" du pointeur) peut être modifié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const T * const p;
    T const * const p;
    sont donc deux syntaxes équivalentes qui veulent dire que ni p, ni *p ne peuvent être modifiés.

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Par défaut
    Merci!!! c'est effectivement dans les notations qu'il y a avait confusion.

    Mais je ne peux pas passer un pointeur T * p; comme paramètre à une fonction qui exige const T *p; ?!

  10. #10
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Si bien sûr, dans ce sens ça ne pose pas de problème.

    Par contre dans l'autre sens ça ne marche pas : tu ne peux pas passer un const T * à une fonction qui attend un T * (non const), puisque la fonction violerait la "constness" de l'argument.

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Par défaut
    D'accord!!!

    Merci d'avoir éclairé ma lanterne sur cette lacune que je traînais depuis ... des lustres

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Il y a également un problème dans le langage C qui empêche de passer un paramètre de type T** à une fonction qui attend T const * const *. Ce problème est corrigé en C++, mais en C il faut un cast explicite.
    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. Réponses: 1
    Dernier message: 12/05/2011, 12h48
  2. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  3. Passer en paramètre d'une fonction (...)
    Par Captain_JS dans le forum C++
    Réponses: 5
    Dernier message: 03/11/2004, 07h18
  4. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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