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

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    mars 2017
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : mars 2017
    Messages : 56
    Points : 39
    Points
    39

    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
    Expert confirmé
    Inscrit en
    mars 2005
    Messages
    1 374
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 374
    Points : 4 028
    Points
    4 028

    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 éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 696
    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 696
    Points : 6 311
    Points
    6 311

    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
    6 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 6 718
    Points : 19 026
    Points
    19 026
    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
    Expert confirmé
    Inscrit en
    mars 2005
    Messages
    1 374
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 374
    Points : 4 028
    Points
    4 028

    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
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    mars 2017
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : mars 2017
    Messages : 56
    Points : 39
    Points
    39

    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 éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 696
    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 696
    Points : 6 311
    Points
    6 311

    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 éclairé Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 378
    Points : 838
    Points
    838

    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);
    }

  9. #9
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 696
    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 696
    Points : 6 311
    Points
    6 311

    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