1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    mars 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : mars 2017
    Messages : 21
    Points : 16
    Points
    16

    Par défaut possible de faire : return if(a==b) ?

    Bonsoir,
    En cours, on a un devoir où on doit construire une bibliothèque pour gérer des piles. On nous demande de faire une fonction pour tester si la pile est vide, et le corps de la fonction doit faire une seule ligne.
    J'ai donc fait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int estVidePile(Pile pile)
    {
        return if((pile.sommet==-1);
    }
    Mais le compilateur me dit expected expression before 'if'
    Pourtant le if renvoi bien une valeur (1 ou 0) puisque c'est ce qui s'affiche quand on fait un printf("%i", if(1==1))

    J'ai loupé quelque chose ?

    Merci d'avance

  2. #2
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 114
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 114
    Points : 3 258
    Points
    3 258

    Par défaut

    Citation Envoyé par r4ph0u Voir le message
    c'est ce qui s'affiche quand on fait un printf("%i", if(1==1))
    si cet appel compile je me mets au Java.

    C'est l'expression booléenne entre les parenthèses du if qui est évaluée à 0 ou 1.

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 2 196
    Points : 4 872
    Points
    4 872

    Par défaut

    Matt_Houston n'a pas répondu à ton problème

    Ton compilateur te dit qu'il manque au moins la partie "vraie": Et oui, il voit une condition avec un if. Et après rien que dalle : je pense qu'il attend au moins une expression ou un bloc (même vide style {})

    Édit : Matt_Houston a raison : le compilateur attend une expression après le return et il trouve un if.


    Solution 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned char estVidePile(Pile pile) {
        return ((pile.sommet == -1)? 1: 0);
    }
    Solution 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned char estVidePile(Pile pile){
        unsigned char ret = (pile.sommet == -1);
     
        return ret;
    }
    Solution 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unsigned char estVidePile(Pile pile){
        if (pile.sommet == -1) {
            return 1;
        } else {
            return 0;
        }
    }
    Solution 4 (à adapter en fonction de ton code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define estVidePile(pile) (pile.sommet == -1)

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 5 928
    Points : 16 386
    Points
    16 386
    Billets dans le blog
    1

    Par défaut

    Bonjour
    Citation Envoyé par r4ph0u Voir le message
    puisque c'est ce qui s'affiche quand on fait un printf("%i", if(1==1))
    Ca m'étonnerait !!!
    A mon avis, tu as dû écrire plutôt printf("%i", 1==1). Ce qui aurait dû t'amener à une solution très proche de la solution 2 de foetus
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int estVidePile(Pile pile){
        return (pile.sommet == -1);
    }

    Citation Envoyé par r4ph0u Voir le message
    et le corps de la fonction doit faire une seule ligne
    Mouais. Soit c'est imposé par ton prof et là je me dis que certains profs ont mal compris les principes de l'enseignement d'un langage (aider à atteindre un but et non une quantité de lignes) ; soit c'est juste une indication, un conseil et là alors c'est moins grave. Mais dans ce cas, il aurait dit "ça peut s'écrire" et non "doit faire". Donc si c'est lui l'auteur du printf("%i", if(1==1))...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  5. #5
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 114
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 114
    Points : 3 258
    Points
    3 258

    Par défaut

    Citation Envoyé par foetus Voir le message
    Matt_Houston n'a pas répondu à ton problème
    Une manière de voir les choses.. Je cherche à attirer l'attention de l'OP sur ce que sont une expression et une structure de contrôle. Ça lui servira ailleurs.


    Citation Envoyé par foetus Voir le message
    Ton compilateur te dit qu'il manque au moins la partie "vraie"
    Non. Le parser dit qu'il attend une expression à la suite du return : expected expressionbeforeif .


    Le type d'une expression booléenne est int. Pourquoi renvoyer un unsigned char ? C'est inutile, déroutant et possiblement inefficace.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    mars 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : mars 2017
    Messages : 21
    Points : 16
    Points
    16

    Par défaut

    Merci, je me sens un peu con, c'est effectivement printf("%i", a==b).

    j'ai donc viré le if dans mon return et c'est bon.

    Merci

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 2 196
    Points : 4 872
    Points
    4 872

    Par défaut

    Citation Envoyé par Matt_Houston Voir le message
    Le type d'une expression booléenne est int. Pourquoi renvoyer un unsigned char ? C'est inutile, déroutant et possiblement inefficace.
    Parce qu'un booléen c'est 2 valeurs : vrai ou faux (0)

    En C, c'est le type char qui a le moins de valeurs. Un entier c'est soit 2^32 soit 2^64 valeurs.

    Ensuite niveau inefficace, le compilateur doit optimiser dans certaines situations.

    Et enfin, c'est un non signé, parce que le signe d'un char par défaut dépend du compilateur : donc on force. Il me semble que chez Microsoft c'est juste un char.

  8. #8
    Membre confirmé Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 308
    Points : 609
    Points
    609

    Par défaut

    Hello,

    Et pourquoi pas, qui me semble bien plus normal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <stdbool.h>
     
    bool pileEstVide(Pile pile) {
        return(pile.sommet==-1);
    }
    Quel que soit l'objet, il sera trouvé dans le dernier endroit dans lequel on l'aura cherché (loi de Boob).
    Se tromper est humain, mais pour vraiment mettre le bordel, il faut y ajouter un ordinateur (cinquième loi de Young)

  9. #9
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 2 196
    Points : 4 872
    Points
    4 872

    Par défaut

    Citation Envoyé par edgarjacobs Voir le message
    Et pourquoi pas, qui me semble bien plus normal
    Parce qu'il a fallu attendre Visual C++ 2013 pour un support plus ou moins complet du C99 (<- et l'autre truc important c'est de pourvoir déclarer ses variables pas seulement au début du bloc)

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

Discussions similaires

  1. return avec Bind : est-ce possible ?
    Par Claude URBAN dans le forum wxWidgets
    Réponses: 2
    Dernier message: 26/11/2016, 11h11
  2. Automatiser création Flash, c'est possible ? Java ou C++ ?
    Par touff5 dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 16/01/2005, 12h01
  3. passer un champ en paramètre, c'est possible ??
    Par marie253 dans le forum Bases de données
    Réponses: 6
    Dernier message: 09/07/2004, 10h22
  4. Réponses: 1
    Dernier message: 18/06/2004, 02h12
  5. Réponses: 2
    Dernier message: 16/07/2003, 15h40

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