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 :

Déréférencement d'un pointeur


Sujet :

C

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut Déréférencement d'un pointeur
    Tout est dans le titre. J'ai ces warning non bloquant que apparaissent depuis le rajout de l'optimisation -03 à la compil.

    Ca correpond à chaque fois à mes cast en double pointeur comme celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (void **)&pointeur
    Bon ca marche quand même c'est juste un warning, mais ya moyen de corriger ca à part de virer -wall lol

    Merci d'avance

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Quel est le type de la variable pointeur?

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    Citation Envoyé par stephl
    Quel est le type de la variable pointeur?
    C'est du Gdk, et là précisément un pixbuf :

    GdkPixbuf *pixbuf;

    En fait pour pouvoir mettre à jour l'image de mon pixbuf dans mon programme, au lieu de mettre en argument mon pixbuf, je mets son adresse... Bref, ca marche bien en tt cas il me semble dans le programme...

  4. #4
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Désolé, je ne vois pas. A quoi sert l'optimisation -03?

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    à optimiser

    plus sérieusement, @Acivurt, as-tu essayé avec -O2 ?

    -O3 effectue effectivement certaines optimisations (je ne sais pas lesquelles) qui m'ont déjà posé des problèmes (pour lire des mpegs).

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    Citation Envoyé par stephl
    Désolé, je ne vois pas. A quoi sert l'optimisation -03?
    Ba euhh ...., techniquement parlant je sais pas lol, mais sur mon calcul de la distance d'hausdorff entre deux images, je passe de 2 minutes à 30 secondes
    Bref, comme j'ai 300 images à comparer, je bénis ces 3 char, mais ca m'interpelles ces warning. Mon code semble pas faux ...

    Merci quand même, tu m'as bien déjà éclairé t'daleur

    @souviron24 pour -02, je test et je re

    @souviron24 1 min + tard pareil jvais test le -01, mais apparement c'est bcp moins interessant niveau temps

  7. #7
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par souviron34
    à optimiser
    Oui, je m'en doute.
    Citation Envoyé par souviron34
    -O3 effectue effectivement certaines optimisations (je ne sais pas lesquelles) ...
    Excusez-moi si je me suis mal exprimé, c'est effectivement sur la nature de ces optimisations que je m'interrogeais.

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    j'avais compris

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    Après 2/3 recherche sur notre cher forum un petit -fno-strict-aliasing, me fait disparaitre les warnings, mais j'ai toujours pas ma réponse au niveau de la qualité de mon code. C'est pas interdit de caster en void**, niveau nombres d'indirections c'est OK &pixbuf, c'est bien un double pointeur, bref, avis aux experts ....

  10. #10
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Selon moi, le cast est tout à fait correct. J'ai trouvé ce lien, je ne sais pas si cela vous sera utile (lire le message #7):
    http://www.codeguru.com/forum/showth...=405240&page=1

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    Citation Envoyé par stephl
    Selon moi, le cast est tout à fait correct. J'ai trouvé ce lien, je ne sais pas si cela vous sera utile (lire le message #7):
    http://www.codeguru.com/forum/showth...=405240&page=1
    parle pô anglais moi ... lol
    Bon, c pas bon signe alors non ? Ca veut dire que l'optimisation peut avoir des répercussion pas sympa (broken dans le texte ) sur l'execution de mon prog. C'est peut être pas super alors, mais j'ai absolument besoin de ces 1m 30 de gagné par traitement (j'en ai 300 à faire...) et pour l'instant pas de problème dans l'éxécution, jcroise les doigts. Jvais essayé d'approfondir cette histoire d'aliasing, parce que pour moi, mon code est bon et fonctionnel, ca me ferais chier qu'il plante pour des optis!

  12. #12
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Pour resumer, tu as:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GdkPixbuf *pixbuf;
    ...
    ... (void **)&pixbuf ...
    J'imagine que le cast se fait lors de l'appel d'une fonction. Typiquement tu caches le vrai type de ton objet, qui est *pixbuf, par un autre type (void *). Du coup, tu brises une des hypotheses de base faite par l'optimiseur, c'est a dire qu'un objet d'un type donne n'est pas accede via un pointeur d'un autre type.
    Du coup, il y a un warning lors de la phase de preparation a l'optimisation (et pas de warning lorsqu'aucune optimisation est demandee, evidemment). Ce warning dit que l'optimisation peut faire quelque-chose de surprenant. A toi d'agir en consequence, mais il faut savoir ce que tu fais : tu es dans l'undefined behaviour, et tout peut arriver, y compris un comportement normal[1]. Le plus sage est un -fno-strict-aliasing, mais tu vas te priver de certaines optimisations.

    [1] Dans l'appel d'une fonction, la gravite d'un tel cast depend de l'utilisation de la variable et de la taille des types. Si tu modifies le pointeur dans la fonction (ce qui me semble probable, vu que tu utilises deux indirections), ca peut etre mechant si les deux types n'ont pas la meme taille. Avec un peu de chance, sur ta machine, un *pixbuf et un *void sont de la meme taille, cependant.

  13. #13
    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
    C'est pas interdit de caster en void**, niveau nombres d'indirections c'est OK &pixbuf, c'est bien un double pointeur, bref, avis aux experts ....
    ce n'est pas une question de niveau d'indirection qui peut imposer un void **
    Le warning tient sans doute au fait que void** n'est pas un pointeur "générique" au contraire de void * et la transformation d'un pointeur sur GdkPixbuf * en un pointeur sur void * peut faire croire au compilateur à la possibilité d'accéder au même objet via deux pointeurs sur des types différents (ce qui est normalement interdit)

  14. #14
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    OK, merci pour l'explication. Que faudrait-il faire alors pour supprimer ce warning? Quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (void **)(void *)&pixbuf
    ?

  15. #15
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    Citation Envoyé par [url=http://mail.opensolaris.org/pipermail/tools-gcc/2005-August/000047.html]dereferencing type-punned pointer will break strict-aliasing rules[/url]
    `-fstrict-aliasing'
    Allows the compiler to assume the strictest aliasing rules
    applicable to the language being compiled. For C (and C++), this
    activates optimizations based on the type of expressions. In
    particular, an object of one type is assumed never to reside at
    the same address as an object of a different type, unless the
    types are almost the same. For example, an `unsigned int' can
    alias an `int', but not a `void*' or a `double'. A character type
    may alias any other type.

  16. #16
    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
    Quels sont les situations qui nécessitent un transtypage sur un void ** ???
    Si on veut un pointeur "banalisé" un void * est fait pour ça. Et si une fonction demande un void** comme argument, cela signifie qu'elle demande de passer l'adresse d'un void *.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    Citation Envoyé par diogene
    Quels sont les situations qui nécessitent un transtypage sur un void ** ???
    Si on veut un pointeur "banalisé" un void * est fait pour ça. Et si une fonction demande un void** comme argument, cela signifie qu'elle demande de passer l'adresse d'un void *.
    En fait, comme c'est dans une fonction callback, je peux passer que par un pointeur void (gpointer en glib), donc comme je veux passer l'adresse du pixbuf en argument, je serais obligé de dereférencer mon pointeur pour recuperer l'adresse et créer mon pixbuf, donc comme je peux pas déreferencer un pointeur void, je le cast avant en void **, j'ai pas trop le choix je pense:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     
    fonction(GtkWidget *widget,gpointer *data)
    {
    GdkPixbuf *pixbuf = (GdkPixbuf *)(gpointer)*data
    ...
    }
    si data n'est qu'un gpointer (void * donc), il va me dire que je déférence un pointeur void ...

  18. #18
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Acivurt
    si data n'est qu'un gpointer (void * donc), il va me dire que je déférence un pointeur void ...
    Ben comme tu sais quel est le "vrai" type de data, c'est assez simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    T fonction(GtkWidget *widget, gpointer *data)
    {
        GdkPixbuf *pixbuf = data;
    ...
    }
    Maintenant, tu peux travailler avec pixbuf sans probleme...

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    Citation Envoyé par DaZumba
    Ben comme tu sais quel est le "vrai" type de data, c'est assez simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    T fonction(GtkWidget *widget, gpointer *data)
    {
        GdkPixbuf *pixbuf = data;
    ...
    }
    Maintenant, tu peux travailler avec pixbuf sans probleme...

    Et bien non justement car data = &pixbuf et non pas pixbuf. C'est *data = pixbuf en fait. d'où le problème.
    et &pixbuf = data; jpense pas que ca marchera mdr

    Bref, je suis obligé de caster en (void **), pour pouvoir accéder à *data

  20. #20
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Acivurt
    Bref, je suis obligé de caster en (void **), pour pouvoir accéder à *data
    NON

    En fait tu fais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    T fonction(GtkWidget *widget, gpointer *data)
    {
        GdkPixbuf **pixbuf = data;
     
        (*pixbuf)....
    ...
    }
    et si tu appeles comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GdkPixbuf *pixbuf;
    ...
    ... (void *)&pixbuf ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Déréférencement d'un pointeur null (dans une classe)
    Par polymorphisme dans le forum Langage
    Réponses: 5
    Dernier message: 13/09/2012, 15h44
  2. Réponses: 8
    Dernier message: 07/06/2010, 21h22
  3. déréférencement d'un pointeur de type incomplet
    Par ikuzar dans le forum Débuter
    Réponses: 1
    Dernier message: 07/09/2009, 18h37
  4. déréférencement d'un pointeur de type incomplet
    Par pauligno dans le forum Débuter
    Réponses: 8
    Dernier message: 10/12/2007, 10h50
  5. déréférencement de pointeurs
    Par gangsoleil dans le forum C
    Réponses: 7
    Dernier message: 12/10/2005, 16h35

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