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 :

Problème déréférencement d'un pointeur incomplet


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut Problème déréférencement d'un pointeur incomplet
    Bonjour,

    Je dois utiliser une librairie en C qui construit et travaille sur des automates (appelés ndd dans la librairie). La structure ndd est définie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct {
      uint4      dim;
      automaton *automaton;
      uint1      base, properties;
    } ndd;
    où uint4, uint1 et automaton sont des structures également. Celle qui m'interesse ici est automaton, définie comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct {
      (...)
      uint4    nb_states;            /*  Number of states.    */
     (...)
     
    } automaton;
    Par exemple, la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ndd *ndd_create_inequation_msdf(r, n, c, b)
    de la librairie retourne un pointeur vers un ndd.

    J'aimerais de mon côté créer un ndd à partir de la méthode ndd_create_inequation_msdf() et récupérer des informations de ce ndd (par exemple, l'attribut nb_states de l'automaton du ndd). Je rencontre à ce moment une erreur de déréférencement d'un pointeur incomplet, quelle que soit la manière dont je procède, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct ndd *nd;
    nd = (struct ndd*) ndd_create_inequation_msdf(r, n, c, b);
    nd->automaton;
    Le simple fait d'accéder à automaton me renvoie l'erreur. Je suppose que si j'arrive à comprendre comment y accéder, je saurai ensuite de la même façon accéder à nb_states de automaton. Quelqu'un peut-il m'aider?

    D'avance merci

  2. #2
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct ndd *nd;
    nd = (struct ndd*) ndd_create_inequation_msdf(r, n, c, b);
    nd->automaton;
    Deux choses qui ne vont pas dans ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nd = (struct ndd*) ndd_create_inequation_msdf(r, n, c, b);
    Pourquoi caster le retour de ndd_create_inequation_msdf ? Ce n'est pas logique (on fait pas double a = (double)pow(1, 2)

    Ensuite, etant donne que ton topic parle de 'dereferencement', je suppose que l'erreur dont tu parles est le NULL deferencement.

    Tu ne testes pas le retour de ndd_create_inequation_msdf. Or tu utilises 'nd' comme si la fonction prenommee ne retournait jamais NULL.

    Ainsi, si ndd_create_inequation_msdf retourne NULL, on se retrouve au runtime avec un appel du genre 'NULL->automaton;'.

    HTH

  3. #3
    Membre confirmé Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut
    Tout d'abord, merci pour ta réponse

    Comme j'ai dit, j'ai essayé beaucoup de choses :p Le cast je l'ai mis car sans j'ai un warning (assignment makes pointer from integer without a cast).

    Apres le ndd retourné je suis sur qu'il n'est pas NULL car j'applique un traitement dessus (autre que ndd->automaton). L'erreur exacte retournée est "déréférencement d'un pointeur de type incomplet". Le test if(ndd != NULL) ne change rien car il est toujours vrai (en fait la méthode retourne NULL seulement si les paramètres sont incorrects)

  4. #4
    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
    Comme j'ai dit, j'ai essayé beaucoup de choses :p Le cast je l'ai mis car sans j'ai un warning (assignment makes pointer from integer without a cast).
    Ce diagnostic n'est pas normal : il dit que la fonction ndd_create_inequation_msdf() retournerait un int alors que dans sa définition elle retourne un pointeur. Très probablement, tu as d'autres avertissements que tu ne signales pas ici, dont celui indiquant un "appel de fonction sans prototype". Si le prototype de ndd_create_inequation_msdf() est inconnu, le compilateur considère que la fonction retourne un int. Dans ce cas, un compilateur bien configuré au niveau des warnings devrait le signaler.

    Probablement, également, la définition de la structure ndd n'est pas connu à ce moment, ce qui en fait un type incomplet. Revoie tes include et/ou la position des déclarations des types et prototypes dans ton programme.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il a autre chose qui me chagrine.
    nd est déclaré comme un pointeur sur une structure.
    Or cette structure contient elle même un pointeur sur la structure automation.
    Est-il certain qu'il n'y aura pas de débordement de mémoire?
    Autrement dit automation est-il créé? ou simplement déclare dans la structure?
    Moi, j'initialiserais la structure avant ndd_create...()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct ndd *nd;
    nd->dim=-1;
    nd->automation=NULL;
    nd = (struct ndd*) ndd_create_inequation_msdf(r, n, c, b);
    nd->automaton;  // à quoi sert cette ligne ?
    Dans la fonction ndd_creat_...() on doit avoir à un moment
    nd->automation = {je ne sais quoi}
    Mais comme nd est certainement inconnu dans cette fonction, il faut trouver un moyen. Pour moi, le prototype devrait plutôt être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      int ndd_create_inequation_msdf(struct ndd *nd, etc.(r, n, c, b));
    // alors on peut faire 
    int ndd_create_inequation_msdf(struct ndd *nd, etc.(r, n, c, b));
    {
      if (nd->automation == NULL) // on est en création
      {
      ...
      }
      return 1; //c'est OK
    }

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Moi, j'initialiserais la structure avant ndd_create...()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct ndd *nd;
    nd->dim=-1;
    nd->automation=NULL;
    nd = (struct ndd*) ndd_create_inequation_msdf(r, n, c, b);
    nd->automaton;  // à quoi sert cette ligne ?
    L'initialisation est complétement inutile puisque les valeurs seront écrasées par le retour de ndd_create_inequation_msdf.

    Citation Envoyé par Pierre Dolez Voir le message
    Dans la fonction ndd_creat_...() on doit avoir à un moment
    nd->automation = {je ne sais quoi}
    Mais comme nd est certainement inconnu dans cette fonction, il faut trouver un moyen. Pour moi, le prototype devrait plutôt être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      int ndd_create_inequation_msdf(struct ndd *nd, etc.(r, n, c, b));
    En laissant le côté le etc.() qui n'est pas une construction C valide à ma connaissance, quel est l'intérêt de passer nd en paramètre de la fonction ? En quoi elle aurait besoin de le "connaitre" ?
    Son rôle est, d'après le nom, de le créer.

Discussions similaires

  1. 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
  2. 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
  3. [ODBC] problème de dates - erreur pointeur null
    Par dorot dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 12/07/2006, 12h16
  4. problème de suppression de pointeur!
    Par gaoul dans le forum C++
    Réponses: 1
    Dernier message: 22/05/2006, 16h48
  5. C++ Problème de fonctions et pointeurs
    Par zmatz dans le forum C++
    Réponses: 3
    Dernier message: 01/10/2005, 16h20

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