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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

+ 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