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 :

[debutant] Problème de pointeur


Sujet :

C

  1. #1
    x
    x est déconnecté
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 14
    Points : 9
    Points
    9
    Par défaut [debutant] Problème de pointeur
    Bonjour je desire modifié un entier u initialisé à 0 à l'aide d'une fonction modifu
    la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void modifu( void*p)
    {
     u = (int)p; // u est static
    }
    l'appel de modifu se fait de deux facons:
    En passant en paramètres un void*n
    1ere facon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int val = 990088;
    void *n = (void*)&val;
    modifu(n);
    2eme facon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int val = 990088;
    void *n = (void*)val; //plus de &
    modifu(n);
    Voila!
    Peut etre vous l'aurez deja deviné mais la premiere facon ne marche pas
    Par contre la seconde marche.

    (Dans la premiere u vaut une variable "bizarre")

    Le truc c'est qu'en utilisant la facon 2 j'ai 2 warning qui me dérange
    Les warning C4047 et C4312

    C4047: int diffère de void* dans différents niveaux d'indirections

    et

    C4312: cast de type conversion de int en void* de taille supérieure
    Voilà !!

    Comment puis je faire pour ne plus avoir ces warning !! (je ne veux bien sur par modifié modifu(void*) et modifu(int)

    Ce serait sympa de me répondre...

  2. #2
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut Re: [debutant] Problème de pointeur
    Citation Envoyé par x
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void modifu( void*p)
    {
     u = (int)p; // u est static
    }
    en supposant que on u soit un static int : tu as oublié de déreférencer le pointeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void modifu( void*p)
    {
     u = (int)*p; // dereferencement avec * pour mettre la valeur de p dans u et non sont adresse
    }
    maintenant l'explication de pourquoi ta méthode 2 marche :
    en soit un pointeur à la même taille qu'un int sur la majorité des système, donc tu peux passer une valeur de int dans un pointeur (ce que tu fait là).
    Du coup avec l'oublis du déréférencement dans la méthode tu obtenais le bon résultat.
    en déréférencant tu devrais avoir la methode 1 correct et la deuxième qui ne "marche plus"

  3. #3
    x
    x est déconnecté
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    ok merci

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut Re: [debutant] Problème de pointeur
    Citation Envoyé par lakitrid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void modifu( void*p)
    {
     u = (int)*p; // dereferencement avec * pour mettre la valeur de p dans u et non sont adresse
    }
    Hmmm, ceci me plaît plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void modifu( void*p)
    {
     u = *((int *) p); // dereferencement avec * pour mettre la valeur de p dans u et non sont adresse
    }

  5. #5
    x
    x est déconnecté
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 14
    Points : 9
    Points
    9
    Par défaut Re: [debutant] Problème de pointeur
    Citation Envoyé par fearyourself
    Citation Envoyé par lakitrid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void modifu( void*p)
    {
     u = (int)*p; // dereferencement avec * pour mettre la valeur de p dans u et non sont adresse
    }
    Hmmm, ceci me plaît plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void modifu( void*p)
    {
     u = *((int *) p); // dereferencement avec * pour mettre la valeur de p dans u et non sont adresse
    }

    C'est parfait !!!

    (la premiere méthode proposé que j'avais essayé entraine l'erreur C2100: indirection non comforme !)

    en tout cas merci...

  6. #6
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut Re: [debutant] Problème de pointeur
    Citation Envoyé par fearyourself
    Hmmm, ceci me plaît plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void modifu( void*p)
    {
     u = *((int *) p); // dereferencement avec * pour mettre la valeur de p dans u et non sont adresse
    }
    Je comprend
    d'un autre coté j'ai pas fait de C depuis 2 ans

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Généralement, on ne stocke pas un entier dans un pointeur, ni vice-versa...

    u est supposé représenter quoi?
    Il faut savoir exactement ce que tu veux y stocker. Si tu mélanges ainsi, c'est souvent une erreur de conception...


    (Enfin, puisque tu as l'air d'être sous Visual, il existe un type qui peut contenir aussi bien un entier qu'un pointeur, mais son utilisation n'est pas recommandée, alors je n'en dirais pas plus.)

  8. #8
    x
    x est déconnecté
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Médinoc
    (Enfin, puisque tu as l'air d'être sous Visual, il existe un type qui peut contenir aussi bien un entier qu'un pointeur, mais son utilisation n'est pas recommandée, alors je n'en dirais pas plus.)
    Ah bon ??? (jamais entendu parler d'une telle ... abération !!)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    C'est un type générique utilisé pour passer à une fonction un paramètre dont on ignore ce que ça pourra être: C'est utilisé notamment pour les fonctions callback:

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef BOOL (*FONCTION_CALLBACK)(
     INT_PTR paramUtilisateur,
     UN_TYPE_DE_LAPI *pUnTruc
     );
    BOOL AppelleCallback(
     FONCTION_CALLBACK fonction,
     INT_PTR paramUtilisateur
     );
    Ici, selon la callback définie par l'utilisateur, le paramètre perso peut être un entier ou un pointeur: Le type est défini pour garantir qu'on peut y stocker l'un ou l'autre. (C'est un type entier garanti de taille suffisante pour y mettre un pointeur: pour utiliser le pointeur ensuite, il faudra un cast en C ou un reinterpret_cast en C++)

    PS: Si tu as déjà programmé en Win32, tu as peut-être déjà utilisé une WindowProc: Là, apprends que les types WPARAM et LPARAM désignent respectivement UINT_PTR et LONG_PTR. Le type LRESULT est également un LONG_PTR.

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

Discussions similaires

  1. [Debutant] Problème de sécurité dans un applet
    Par peaceinpal dans le forum Applets
    Réponses: 3
    Dernier message: 09/09/2004, 20h56
  2. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  3. [debutant]Problèmes
    Par BibiGmi dans le forum OpenGL
    Réponses: 2
    Dernier message: 05/03/2004, 14h00
  4. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39
  5. [Debutant] Problème du linker [Dev-c++4]
    Par Macdir dans le forum Dev-C++
    Réponses: 3
    Dernier message: 30/05/2003, 20h50

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