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 :

Pile de pointeurs


Sujet :

C

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Par défaut Pile de pointeurs
    Bonjour,


    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    struct test
    {
      int t;
      short *tableau;
    };
     
    typedef struct test *BIG;
     
    static BIG test_depile( pile p )
    {
      if ( pilevide(p) ) erreur("trop d'opérateurs");
      return depile(p);   // erreur : return makes pointer from integer without a cast
     
    }
     
    --------------------------------
     
    struct descripteur_de_pile { 
      int taille;
      BIG* vect;
      int sommet;
    };
     
    struct descripteur_de_pile * cree_pile( void )
    {
      struct descripteur_de_pile * self = malloc(sizeof(struct descripteur_de_pile));
      self->taille = TAILLE_INITIALE;	/* doit être > 0 */
      self->vect = malloc(self->taille*sizeof(BIG));
      self->sommet = 0;
      return self;
    }
     
    BIG depile( struct descripteur_de_pile * self ) 
    {
      assert(self->sommet > 0);
      return self->vect[--self->sommet];
    }
    -----------------------------

    J'ai ensuite une autre fonction qui utilisent les expressions postfixées sur des BIG.


    Pourquoi cette erreur à la compilation ?


    Merci.

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    la première :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct test *BIG;
    ici tu définis un pointeur comme étant une structure...



    PS: utilises la balise "code" (le #) pour encadrer ton code.. C'est (très) nettement plus lisible..

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Par défaut
    Oui, je souhaite que BIG soit un pointeur sur une structure.
    Mais cette ligne est dans mon fichier .h

  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
    Citation Envoyé par souviron34 Voir le message
    la première :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct test *BIG;
    ici tu définis un pointeur comme étant une structure...
    .....
    Non, il définit très correctement BIG comme un pointeur sur structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static BIG test_depile( pile p )
    {
      if ( pilevide(p) ) erreur("trop d'opérateurs");
      return depile(p);   // erreur : return makes pointer from integer without a cast
     
    }
    Montre la définition du type pile.

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct descripteur_de_pile * pile;

  6. #6
    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
    Est-ce qu'un prototype de depile() est bien déclaré AVANT la définition de test_depile() ?

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Par défaut
    C'est bizarre, comme ça je dirais :
    * la fonction erreur() retourne un entier et l'erreur est sur sa ligne et non pas sur la suivante.
    * problème d'inclusion de .h qui fait que la déclaration de dépile n'est pas faite avant et la déclaration par défaut lui fait retourner un int. Mais dans ce cas il doit certainement y avoir un warning en plus.

    Sinon, j'ai pas trop d'autre idée...

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Par défaut
    Voici les erreurs correspondant aux lignes données :

    cc1: warnings being treated as errors
    In function ‘teste_et_depile’:
    erreur: implicit declaration of function ‘depile’
    erreur: return makes pointer from integer without a cast


    Donc oui c'est bien un problème d'inclusion de .h
    C'est résolu, merci beaucoup, même s'il me reste des problème à l'exécution maintenant.

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Par défaut

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Par défaut
    Voici mes erreurs à l'éxécution :

    A quoi cela peut être du ?

    *** glibc detected *** ./postfix: double free or corruption (fasttop): 0x09570070 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7e9c604]
    /lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7e9e5b6]
    ./postfix[0x8048b48]
    ./postfix[0x8048922]
    ./postfix[0x8048ac0]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7e43775]
    ./postfix[0x80486a1]
    ======= Memory map: ========
    08048000-0804a000 r-xp 00000000 08:05 365446 /home/
    0804a000-0804b000 r--p 00002000 08:05 365446 /home/
    0804b000-0804c000 rw-p 00003000 08:05 365446 /home/
    09570000-09591000 rw-p 09570000 00:00 0 [heap]
    b7d00000-b7d21000 rw-p b7d00000 00:00 0
    b7d21000-b7e00000 ---p b7d21000 00:00 0
    b7e1d000-b7e2a000 r-xp 00000000 08:05 315809 /lib/libgcc_s.so.1
    b7e2a000-b7e2b000 r--p 0000c000 08:05 315809 /lib/libgcc_s.so.1
    b7e2b000-b7e2c000 rw-p 0000d000 08:05 315809 /lib/libgcc_s.so.1
    b7e2c000-b7e2d000 rw-p b7e2c000 00:00 0
    b7e2d000-b7f89000 r-xp 00000000 08:05 332640 /lib/tls/i686/cmov/libc-2.9.so
    b7f89000-b7f8a000 ---p 0015c000 08:05 332640 /lib/tls/i686/cmov/libc-2.9.so
    b7f8a000-b7f8c000 r--p 0015c000 08:05 332640 /lib/tls/i686/cmov/libc-2.9.so
    b7f8c000-b7f8d000 rw-p 0015e000 08:05 332640 /lib/tls/i686/cmov/libc-2.9.so
    b7f8d000-b7f90000 rw-p b7f8d000 00:00 0
    b7f9d000-b7f9f000 rw-p b7f9d000 00:00 0
    b7f9f000-b7fa0000 r-xp b7f9f000 00:00 0 [vdso]
    b7fa0000-b7fbc000 r-xp 00000000 08:05 315799 /lib/ld-2.9.so
    b7fbc000-b7fbd000 r--p 0001b000 08:05 315799 /lib/ld-2.9.so
    b7fbd000-b7fbe000 rw-p 0001c000 08:05 315799 /lib/ld-2.9.so
    bfcaf000-bfcc4000 rw-p bffeb000 00:00 0 [stack]
    Abandon

  11. #11
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Par défaut
    double free or corruption
    Signifie certainement que tu as du libérer (free) quelque chose qui n'aurait pas dû être libéré.
    Pour trouver facilement la source, le mieux est d'utiliser valgrind. Si tu as compilé ton programme avec l'option -g, il te dira la ligne ou se produit l'erreur.

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Par défaut
    Oui, j'ai trouvé le free de trop, merci.

    Mais quand je teste ma fonction, voici ce qu'il affiche :

    ./postfix 12 2 +
    Usage : ./postfix <expression entière postfixe>
    Affiche le résultat de l'évaluation de l'expression.
    Opérandes et opérateurs sont séparés par des espaces.
    Les opérateurs sont '+', '-', 'x' et ':'.

    Donc l'erreur vient de la fonction 'evalue' mais je ne vois pas où...?

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Par défaut
    Sans ton code on ne pourra pas t'aider !

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

Discussions similaires

  1. Probleme piles (pointeurs)
    Par SaMsIDevelop dans le forum Ada
    Réponses: 3
    Dernier message: 31/03/2012, 14h28
  2. Création d'une pile sans pointeurs
    Par JonesKey dans le forum Débuter
    Réponses: 3
    Dernier message: 29/11/2009, 17h27
  3. Réponses: 7
    Dernier message: 24/03/2006, 10h51
  4. Classe, pile, pointeurs et casse-tête!
    Par zazaraignée dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2005, 16h57
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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