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 :

empiler dans un switch case ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut empiler dans un switch case ?
    Bonsoir, j'ai un petit soucis en C.

    Dans mon main je déclare une pile d'entiers que j'initialise à pilenouv();
    et j'embarque mon pointeur de la pile sur chaque fonction.

    j'ai une fonction qui traite les choix pour un menu avec switch case qui prend en parametre cette pile que j'ai initialisée dans mon main().

    elle est de la forme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Bool choice(char s,pile p)
     
    {
    switch(s)
          {
    case 'e': p=empiler(p,12);
    printf("p->n vaut %d",p->n); // affiche bien 12
    printf("la hauteur est %d",hauteur(p)) // affiche 1
    default : printf("test");
          }
    return true;
    }
    la pile qui est pourtant un pointeur passé en parametre de toutes les fonctions n'a pas l'air d'etre modifiée une fois sorti du menu.
    Si je revien dans le meme menu pour empiler encore j'obtiens les meme valeur de printf (meme 1 pour la hauteur), ce qui signifie qu'en sortant du menu la pile n'a pas été modifiée.

    si quelqu'un à une explication à mon problème, elle est la bienvenue

  2. #2
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Par défaut
    Passe tu l'adresse de la pile en paramètre ?
    Si ce n'est pas le cas la fonction va réaliser une copie de ta structure pile qui sera détruite à la fin de la fonction.

  3. #3
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    essaies ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bool choice(char s,pile *p)
    plutot que ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bool choice(char s,pile p)
    et adapte le code dans le switch.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    merci pour vos réponses mais mon problème ne vient pas de là puisque j'ai un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct spile
    {
    	int n;
    	struct spile *s;
    } Spile, *pile ;
    par conséquent l'adresse de la pile est bien passée en paramètre ...

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut


    Bonjour,
    Si tu nous mettais un peu plus de code, ça nous aiderait à voir d'où vient le problème.
    Par exemple la fonction « empiler() »…

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    biensur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pile empiler(pile p, int i)
    {
     
    pile q=(Spile)malloc(sizeof(Spile));
    q->n=i;
    q->s = p;
    return q;
    }
    pour pilenouv j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define NULL (void *) 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pile pilenouv(void)
    {
    return (pile) NULL;
    }
    et merci

  7. #7
    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 pirlo21 Voir le message
    merci pour vos réponses mais mon problème ne vient pas de là puisque j'ai un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct spile
    {
    	int n;
    	struct spile *s;
    } Spile, *pile ;
    par conséquent l'adresse de la pile est bien passée en paramètre ...
    dans la fonction choice() tu modifies le paramètre p, pour que les modifications soient effectives en dehors de la fonction, il faut passer l'adresse de p (ou alors faire retourner p par ta fonction et récupérer le retour dans l'appelant).

    Que p soit déjà une adresse ne change rien à l'affaire : p étant une adresse tu peux modifier ce qui est présent à l'adresse contenu dans p, si tu veux modifier p il faut bel et bien passer l'adresse de p (ou retourner la nouvelle adresse).

    Au passage :
    • Pourquoi masquer le pointeur par un typedef ? Tu perds en information et donc en lisibilité.
    • Pourquoi confondre pile et élément de la pile (je sais c'est courant, mais ça me choque à chaque fois) ?

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Une autre remarque aussi :
    As-tu as bien inclus <stdlib.h> pour la fonction malloc (ce qu'il faut absolument faire sinon le compilateur considère que la fonction retourne un int) ? Car si tu redéfinis NULL, le compilateur devrait normalement te crier dessus.

  9. #9
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour,

    Citation Envoyé par gl Voir le message
    Au passage :
    • Pourquoi masquer le pointeur par un typedef ? Tu perds en information et donc en lisibilité.
    • Pourquoi confondre pile et élément de la pile (je sais c'est courant, mais ça me choque à chaque fois) ?
    Tout à fait d'accord.
    Pour le premier point, ce serait moins gênant si tu indiquais clairement que ton typedef définit un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef (...) *ptrPile;

Discussions similaires

  1. Réponses: 165
    Dernier message: 03/09/2009, 15h35
  2. Position de default et case dans un switch
    Par Glutinus dans le forum C
    Réponses: 16
    Dernier message: 11/09/2006, 22h17
  3. [C#] Comment faire un OU dans un Switch/Case ?
    Par toxycyty dans le forum C#
    Réponses: 1
    Dernier message: 08/09/2006, 15h57
  4. Une boucle for dans un switch case?
    Par Death83 dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2006, 14h05
  5. Réponses: 6
    Dernier message: 26/01/2003, 13h45

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