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 générique comme sortie de fonction ?


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 33
    Par défaut Pointeur générique comme sortie de fonction ?
    Bonjour,
    Soit la fontion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BOOL MaFonction(void* var)
    {
    uneStructure  * varStruct= (uneStructure *) var;
    ...
    // varStruct modifiée
    ...
    }
     
    typedef struct uneStructure  {
    ....
    } uneStructure
    Est-ce var peut être considérée comme une sortie ou est-ce obligatoirement qu'une entrée de la fonction ?
    Merci

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    C'est une entrée, car l'adresse de "var" ne sera pas modifiée par l'appel de la fonction. Or, c'est "var", le paramètre, et non pas ce qui est pointé par "var". Si tu veux le transformer en valeur de retour (= pouvoir modifier "var", il faut passer "void** var" comme paramètre.

    Après, les données pointées par "var" peuvent être modifiées, en effet, mais ça c'est plutôt un effet de bord... Et pas mal "planqué", car l'utilisation du type "void*" masque le type réel de la donnée, donc fait sauter les vérifications du compilateur à ce sujet.

    Typiquement, tu peux y passer un pointeur sur n'importe quoi sans le moindre cast, donc tu vas aussi très certainement faire n'importe quoi dans les appels.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 33
    Par défaut
    Pour ma question initiale, c'est ok.
    Mais j'ai pas dû tout comprendre sur les pointeurs génériques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BOOL MaFonction(void* var)
    {
    uneStructure  * varStruct= (uneStructure *) var;
    1)Dis-moi si je me trompe :
    var est une adresse en paramètre sur un type inconnu.
    varStruct prend ensuite pour valeur var qui est forcée à pointer sur uneStructure.

    2) En quoi est-ce que cet exemple ci-dessus permet de "protéger" la variable var de l'utilisateur de la fonction MaFonction ? ie par rapport à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BOOL MaFonction(uneStructure  * varStruct)
    {
    //code;

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par wilval Voir le message
    var est une adresse en paramètre sur un type inconnu.
    C'est une adresse sans type, pour être plus précis... Ce qui ne change absolument pas le fait que var est passé par valeur : tu ne peux pas modifier le pointeur en question (même si tu peux modifier les données situées à l'adresse var).

    Citation Envoyé par wilval Voir le message
    varStruct prend ensuite pour valeur var qui est forcée à pointer sur uneStructure.
    Et c'est là que tu risques les ennuis : qu'est-ce qui te garantit que le pointeur est valide, et de taille suffisante ?

    Citation Envoyé par wilval Voir le message
    2) En quoi est-ce que cet exemple ci-dessus permet de "protéger" la variable var de l'utilisateur de la fonction MaFonction ?
    Simple, prends ceci par exemple :
    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
    BOOL MaFonctionAvecVoid (void* var) {
    .....
    }
     
    BOOL MaFonctionSansVoid (uneStructure* var) {
    .....
    }
     
    int main() {
     
       char dummy = '\0' ;
     
       MaFonctionAvecVoid(&dummy) ; // Compile, mais plantage plus que probable à l'exécution.
       MaFonctionSansVoid(&dummy) ; // Refuse de compiler.
    }
    Passer un pointeur à une fonction SANS lui passer AUSSI la taille des données accessibles via ce pointeur, c'est un casse-gueule de première...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Pointeur en sortie de fonction
    Par François L. dans le forum Débuter
    Réponses: 2
    Dernier message: 23/03/2012, 11h55
  2. Réponses: 4
    Dernier message: 30/10/2009, 12h45
  3. Réponses: 2
    Dernier message: 04/06/2009, 20h42
  4. vector<bool> comme argument de fonction
    Par Krishna dans le forum SL & STL
    Réponses: 11
    Dernier message: 09/09/2004, 09h30
  5. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 14h41

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