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 :

Affichage liste chaine


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Affichage liste chaine
    Bonjour,

    Je cherche a afficher les différents élèments d'une liste chainée, pour cela j'ai créé une fonction récursive terminal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        void print(cell *list) {
     
           if (list == NULL)
              return;
     
           printf("%s ",list->name);
     
           return print(list->next);
        }

    A ma grande surprise ce code n'est pas valide avec la norme C90, lorsque je le compile de la maniere suivante :
    gcc -Wall -g -ansi -pedantic file.c

    J'ai le warning suivant :
    "warning: ISO C forbids ‘return’ with expression, in function returning void"

    Il n'est pas possible de faire de la récursivité terminal avec une fonction void si l'on respecte la norme C90 ?

    Merci

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    C'est parce que tu écris return quelque chose dans une fonction qui ne retourne rien.
    Décompose en deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        void print(cell *list) { 
           if (list == NULL) 
              return; 
           printf("%s ",list->name);
           print(list->next);
           return ;
        }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Bonsoir,

    Désolé de revenir dessus, mais si je ne me trompe pas la version corrigé correspond a du récursif classique (non terminal). Ma question se portait sur faire une fonction void qui fait du récursif terminal. Apparament ce n'est pas possible.

    Merci

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Diogene te l'as expliquer clairement : peut importe ton code, tu declare ta fonction comme retournant void , c'est a dire rien, et dans ta fonction on trouve :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           return print(list->next);
    C'est absolument incompatible.

    Si tu ne vois toujours pas ce que je veux dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        void print(cell *list) {
     
           if (list == NULL)
              return;
     
           printf("%s ",list->name);
           
           return print(list->next);
        }
    Comme te l'as dit diogene, separe l'appel recursif du return :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        void print(cell *list) {
     
           if (list == NULL)
              return;
     
           printf("%s ",list->name);
           
           print(list->next);
           return;
        }
    Bonne continuation


    EDIT : d'ailleur, si je ne m'abuse, ce code peut etre compacter de cette maniere :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        void print(cell *list) 
        {
            if (list != NULL)
            {
                  printf("%s ",list->name);    
                  print(list->next);
            }
        }

Discussions similaires

  1. Affichage liste chainée
    Par lefty972 dans le forum Ada
    Réponses: 1
    Dernier message: 15/05/2011, 20h10
  2. Réponses: 6
    Dernier message: 25/07/2009, 09h21
  3. Listes Chainées probleme d'affichage
    Par reapa dans le forum C
    Réponses: 2
    Dernier message: 11/07/2008, 02h38
  4. Affichage du contenu d'une liste chainée
    Par étoile de mer dans le forum Débuter
    Réponses: 21
    Dernier message: 03/07/2008, 02h15
  5. Liste chainée: Fonction d'affichage
    Par mayalabeille dans le forum C
    Réponses: 9
    Dernier message: 28/04/2007, 15h32

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