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 :

De la gestion du const


Sujet :

C

  1. #1
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut De la gestion du const
    Bonjour,

    disons que je veuille écrire une fonction delay(callback cb, void *arg) avec cb() une fonction de type typedef int (*callback)(void *arg). L'idée est d'appeler la fonction cb() en lui passant l'argument arg.

    Mon soucis apparaît lorsque je veux spécifier/assurer à l'utilisateur de ma fonction delay() qu'elle ne modifiera pas la zone mémoire pointée par arg. Néanmoins, il ne m'est pas possible d'ajouter le mot clé const : depay(callback cb, const void *arg) car au final, la fonction delay() finie par appeler cb(arg) qui elle modifie (éventuellement) arg.

    Une idée ?

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Salut prgasp77 !

    Tu as une fonction qui risque de modifier un paramètre et tu souhaites assurer à l'utilisateur qu'elle ne va pas le modifier ?

    Si c'est bien ça, tu es un sacré arnaqueur

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Tu as une fonction qui risque de modifier un paramètre et tu souhaites assurer à l'utilisateur qu'elle ne va pas le modifier ?

    Si c'est bien ça, tu es un sacré arnaqueur
    Effectivement. néanmoins, le paramètre ne sera modifié que par la fonction utilisateur qui se trouve être un paramètre de delay().

    delay() ne sais rien de arg, et ne le modifie pas directement. C'est de l'arnaque à but documentaire.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    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
    void cb(void *arg)
    {
        * (int*) arg = 666;
    }
     
    void delay(void const *  arg)
    {
        cb( (void*) arg);
    }
     
     
    int main (void)
    {
        int a = 42;
        int *p = &a;
     
        delay(p);
        printf("%d", a);
     
      return 0;
    }
    Je n'aurais pas mieux à te proposer

    Mais c'est quand même une vilaine pratique que de caster un argument constant en une valeur non constante.

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Je n'aurais pas mieux à te proposer
    C'est bien ce que je craignais. Merci tout de même.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Désolé / de rien (rayer la mention inutile).

    Sémantiquement, c'est bizarre ton histoire : la fonction 1 ne modifie pas le paramètre mais appelle une fonction 2 qui va le modifier. Du point de vue de la fonction appelant fonction 1, cela revient à dire que fonction 1 modifie le paramètre. Ton problème se règle par un commentaire ou une remarque dans la documentation, mais je ne vois pas de solution "dans le code".

  7. #7
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Désolé / de rien (rayer la mention inutile).


    Citation Envoyé par Bktero Voir le message
    Sémantiquement, c'est bizarre ton histoire : la fonction 1 ne modifie pas le paramètre mais appelle une fonction 2 qui va le modifier. Du point de vue de la fonction appelant fonction 1, cela revient à dire que fonction 1 modifie le paramètre. Ton problème se règle par un commentaire ou une remarque dans la documentation, mais je ne vois pas de solution "dans le code".
    Justement, sémantiquement, delay() ne modifie pas arg, c'est cb() qui le fait. Mais effectivement, delay() sera bien documentée. Mais comme tu le sais sûrement, la première documentation lue est le prototype de la fonction.

    Ma sollution sera finalement
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef __DOXYGEN__
       int delay(callback cb, void *arg);
    #else // __DOXYGEN__
       /**
        * \fn int delay(callback cb, const void *arg);
        * ...
        */
       int delay(callback cb, const void *arg);
    #endif // __DOXYGEN__


    Merci pour ton aide.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/08/2002, 21h37
  2. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  3. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  4. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h53

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