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 :

appel d'une fonction dans une condition


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut appel d'une fonction dans une condition
    bonjour,

    Comment implémenter correctement la condition :
    si telle fonction est appelée alors

    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
     
    #include <stdio.h>
     
    int main(void) {
      printf("Hello World\n");
      //si la fonction ecrit est appelée
      if(ecrit)  //mauvaise syntaxe
      {
         printf("fonction appelée") ; 
      }
     
     
      return 0;
    }
     
    void ecrit()
    {
    printf("zozo");
    }
    merci de votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Si écrit est une fonction, ce que tu peux faire c'est l'appeler. Et pour appeler une fonction, il lui faut ses paramètres entre parenthèses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if ( ecrit() )  // appelle la fonction, le if se fait sur ce qu'à répondu la fonction (faux ou pas)
    Tu ne peux pas faire if (fonction a été appelée), ça n'a pas de sens tu sais bien si tu as appelé la fonction ou pas!

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut
    dans un projet en C sur www.replit.com,ce code ne fonctionne pas pourtant:
    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
     
    #include <stdio.h>
    #include <string.h>
     
    int main(void) {
      printf("Hello World\n");
     
      //si la fonction ecrit est appelée
      if(ecrit())
      {
         printf("fonction appelée") ; 
      }
     
     
      return 0;
    }
     
    void ecrit(void)
    {
    printf("zozo");
     
    }
    Pourquoi?Que dois-je modifier pour qu'il fonctionne?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par tabkelm Voir le message
    Pourquoi?Que dois-je modifier pour qu'il fonctionne?
    Es-tu sérieux ?

    1 condition c'est 1 booléen : le fameux 0 c'est faux, tout le reste est vrai.

    Est-ce que ta fonction retourne 1 booléen ? non

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Une possibilité:
    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
    #include <stdio.h>
    #include <string.h>
     
    int  ecrit(void) {
       return  printf("zozo");
    }
     
    int  main(void) {
      printf("Hello World\n");
     
      //si la fonction ecrit est appelée
      if ( ecrit() ) {
          printf("fonction appelée"); 
      }
      else {
          printf("la aussi, la fonction a été appelée");
      }
    }

  6. #6
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut,

    Citation Envoyé par dalfab Voir le message
    Tu ne peux pas faire if (fonction a été appelée), ça n'a pas de sens tu sais bien si tu as appelé la fonction ou pas!
    En mode brut de décoffrage, un drapeau global is_ecrit_called peut répondre à la question. Mais il y a fort à parier que c'est encore et encore un problème XY. Donc à toutes fins utiles je vais me contenter d'en rappeler la définition :

    Citation Envoyé par Wikipedia
    Le problème XY est un problème de communication rencontré lors d'une demande d'assistance. La personne ayant un problème X imagine une solution Y, et au lieu de demander de l'aide pour X, cette personne demande de l'aide pour mettre en place la solution Y. Cependant, il arrive que résoudre le problème Y ne résolve que de manière partielle ou bancale le problème X. Ainsi, ne pas présenter le problème original et introduire un problème autre peut conduire à des difficultés de communication et à des solutions insatisfaisantes.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par tabkelm Voir le message
    dans un projet en C sur www.replit.com,ce code ne fonctionne pas pourtant:
    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
     
    #include <stdio.h>
    #include <string.h>
     
    int main(void) {
      printf("Hello World\n");
     
      //si la fonction ecrit est appelée
      if(ecrit())
      {
         printf("fonction appelée") ; 
      }
     
     
      return 0;
    }
     
    void ecrit(void)
    {
    printf("zozo");
     
    }
    Pourquoi?Que dois-je modifier pour qu'il fonctionne?
    Il faut, déjà, apprendre à être précis dans la description du problème... Parce que "ce code ne fonctionne pas", ca ne veut juste rien dire.

    Si tu veux correctement décrire ton problème, il faut préciser si "ce code ne fonctionne pas"
    1. parce qu'il ne compile déjà pas (on a une erreur de compilation)
    2. parce qu'il ne génère pas l'exécutable (on a une erreur à l'édition de liens)
    3. ou parce que, une fois l'exécutable généré, lorsqu'on l'exécute, il ne donne pas le résultat attendu

    Bon, il est vrai que je t'engueule pour la forme ici, histoire de te faire prendre conscience que la précision est une vertu essentielle et primordiale, car il se fait que je sais parfaitement ce qui se passe: ton code ne peut tout simplement pas compiler

    Cependant, il faut bien comprendre que si tu ne prend pas l'habitude d'appeler un chat un chat en donnant des indications les plus précises possibles sur les problèmes que tu rencontre, il y a de nombreuses situations dans lesquelles les réponses que tu obtiendra ne te seront tout simplement d'aucune aide, car totalement "à coté de la plaque" par rapport au problème que tu rencontre !

    Donc, ton code ne compile pas. La véritable question que tu devrais poser n'est donc pas "comment dois-je le modifier pour qu'il fonctionne", mais bien "pouvez vous m'aider à comprendre ce qui ne va pas", car, si on te dis en trois ligne "tu fais ceci, et cela, et ton problème sera résolu", mais que tu ne comprends absolument pas ce qui a permis de résoudre ton problème, tu n'auras rien appris.

    C'est pourquoi je vais me contenter de te rappeler un point essentiel:
    le compilateur (et la plupart des outils que tu vas manipuler) vont lire ton code exactement de la même manière que toi quand tu lis un bon bouquin: de la première ligne à la dernière. Sans passer trois lignes pour passer de la deuxième à la cinquième ni revenir en arrière.

    Le compilateur a cela en plus d'un peu "casse pied" qu'il refuse systématiquement d'appeler "quelque chose" qu'il ne connait pas:
    • Si tu veux créer une variable d'un type qu'il ne connait pas, il va s'arrêter en disant "je ne connait pas ce type de donnée"
    • Si tu veux appeler une fonction "dont il ignore tout", il va également s'arrêter en te disant "je ne connais pas cette fonction".

    Et c'est, en gros, ce qui se passe ici. D'ailleurs, c'est sans doute le sens du message d'erreur qu'il aura affiché et qui signifie, en gros que
    Lorsque je suis arrivé à la ligne 9 du fichier, j'ai croisé l'appel à la fonction ecrit() dont j'ignore tout
    La solution à ce problème est donc de s'assurer que le compilateur en connaisse "suffisamment" sur la fonction appel que pour accepter que l'on y fasse appel.

    C'est à dire que le compilateur doit au moins savoir
    • Quel type de donnée sera renvoyé par la fonction une fois que son exécution sera terminée (si elle renvoie une donnée du moins), afin de pouvoir faire des vérifications sur ce type de donnée (entre autres, afin de pouvoir s'assurer que le type de la donnée renvoyé est compatible avec l'usage que tu essaye d'en faire)
    • quel est le nom de la fonction, afin de être en mesure d'identifier la fonction appelée de manière strictement unique et non ambigue
    • la liste des paramètres que la fonction attend éventuellement, afin de s'assurer que nous lui transmettons des données qui pourront être utilisées par la fonction.

    Autrement dit, il faut que le compilateur ait croisé, avant la ligne 9 (et en dehors de toute fonction) la déclaration de la fonction ecrit. Et cela se fait donc sous une forme que l'on peut généraliser en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type_de_retour nom_de_la_fonction ( liste_de_paramètres ) ;
    Seulement, le fait d'ajouter une déclaration de la fonction écrit avant la ligne 9 et en dehors de toute fonction ne va sans doute résoudre qu'une partie du problème, car la fonction écrit est de type void, ce qui signifie qu'elle ne renvoie aucune donnée. Ce qui va forcément poser problème vu que l'on va essayer de tester ... la valeur renvoyée par cette fonction.

    Il faudra donc changer cela (au niveau de la déclaration comme de l'implémentation de la fonction), car, autrement, le compilateur ne va rien comprendre (comment voulez vous tester une valeur qui n'est pas sensée être renvoyée risque-t-il de te demander) et, par exemple, décider que cette fonction renverra un nombre entier.

    Evidemment, si tu t'engages à ce que la fonction renvoie une valeur de type entier, il faudra également modifier le code de la fonction pour s'assurer que ton engagement soit respecté. Et cela se fait au travers de l'instruction return <valeur>Le plus chouette, c'est que printf renvoie également une valeur entière, qui correspond au nombre de caractères qui ont été écrits; et, cerise sur le gâteau, que la valeur entière 0 est la seule valeur qui sera convertie en une valeur booléenne équivalent à false, alors que toutes les autres (que ce soit -3, -150000 ou +39782) seront converties en une valeur booléenne correspondant à true. On peut donc écrire le code de la fonction ecrit en lui demandant, tout simplement, de renvoyer le résultat qui a lui-même été renvoyé lors de l'appel à printf

    Tu devrais désormais, grâce à toutes les informations que je t'ai données, savoir exactement ce qu'il faut modifier dans ton code non seulement pour qu'il compile et permette la génération d'un exécutable, mais aussi pour qu'il te fournisse le résultat attendu

    une dernière remarque

    Si tu fais appel à la fonction ecrit dans un test (if(ecrit() ) la fonction aura forcément été appelée, vu que, autrement, on serait incapable récupérer la valeur ... qu'elle n'aura pas du renvoyer (vu qu'elle n'a pas été appelée).
    l'affichage printf("fonction appelee"); est donc ... très mal choisi, car, même si la fonction échoue, l'appel à la fonction aura forcément été effectué.

    il serait beaucoup plus correct (même si le texte ici n'est pas "faux") d'afficher un texte qui soit plutôt proche de printf("fonction correctement exécutée"); car c'est effectivement ce qui se sera passé
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut
    le code de daflab:
    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
     
    #include <stdio.h>
    #include <string.h>
     
    int  ecrit(void) {
       return  printf("zozo");
    }
     
    int  main(void) {
      printf("Hello World\n");
     
      //si la fonction ecrit est appelée
      if ( ecrit() ) {
          printf("fonction appelée"); 
      }
      else {
          printf("la aussi, la fonction a été appelée");
      }
    }
    résout mon problème
    mais maintenant au lieu de mettre dans la condition la fonction ecrit,je mets une autre fonction retournant par exemple une structure
    comme ceci:
    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
     
    #include <stdio.h>
    #include <string.h>
     
    int A,B,C;
     
    struct vecteur3{
      int x;
      int y;
      int z;
    };
     
    typedef struct vecteur3 vecteur;
     
    vecteur fonction(int a,int b,int c){
      vecteur V;
      V.x=a;
      V.y=b;
      V.z=c;
      return V;
    }
     
    int  main(void) {
      printf("Hello World\n");
     
      //si fonction est appelée
     if (fonction(A,B,C) ) //là ça ne marche plus.Pourquoi?
      {
          printf("fonction appelée"); 
      }
      else {
          printf("la aussi, la fonction a été appelée");
      }
      return 0;
    }
    l'appel dans la condition ne fonctionne pas.Pourquoi.
    Qu'ai-je oublié?

  9. #9
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Citation Envoyé par tabkelm Voir le message
    l'appel dans la condition ne fonctionne pas.Pourquoi.
    Qu'ai-je oublié?
    Peut-être de lire les réponses ? Non ?
    Je ne sais pas, comme ça au hasard, disons la #4

    Citation Envoyé par foetus Voir le message
    1 condition c'est 1 booléen : le fameux 0 c'est faux, tout le reste est vrai.
    Est-ce que ta fonction retourne 1 booléen ? non
    Alors est-ce que tu vas finir par prendre en considération ces réponses ou tu préfères nous rejouer le remake d'un jour sans fin ?

    Oui parce que dans la thématique des boucles temporelles c'est le film qui ressort en premier.
    C'est quand même assez incroyable à quel point le synopsis colle bien au personnage principal de la discussion :

    Phil Connors, journaliste à la télévision et responsable de la météo part faire son reportage annuel dans la bourgade de Punxsutawney où l'on fête le "Groundhog Day" : "Jour de la marmotte". Dans l'impossibilité de rentrer chez lui ensuite à Pittsburgh pour cause d'intempéries il se voit forcé de passer une nuit de plus dans cette ville perdue. Réveillé très tôt le lendemain il constate que tout se produit exactement comme la veille et réalise qu'il est condamné à revivre indéfiniment la même journée.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par tabkelm Voir le message
    mais maintenant au lieu de mettre dans la condition la fonction ecrit,je mets une autre fonction retournant par exemple une structure...l'appel dans la condition ne fonctionne pas.Pourquoi.
    Qu'ai-je oublié?
    Tu as oublié d'étudier en quoi le code de daflab était différent du tien au lieu de voir ça comme une espèce de cadeau divin et mystérieux. Tu as oublié aussi de lire le post de koala01 qui a écrit une magnifique prose bien détaillée et laissant la pénible impression qu'il a bossé pour rien. Pourtant il l'a bien écrit quand il te dit que la valeur entière 0 est la seule valeur qui sera convertie en une valeur booléenne équivalent à false (ce qui permet à n'importe qui de correctement câblé d'en déduire que toute autre valeur est donc convertie en une valeur booléenne équivalent à true).
    Tu as oublié aussi d'ouvrir un bouquin de C élémentaire avant de faire du C avancé (retour de structures, etc), bouquin expliquant aussi qu'en C de base, toute valeur non nulle est considérée comme vrai (c'est aussi le cas en C avancé sauf que là on ne le dit plus tellement c'est devenu implicitement connu).
    Et tu as oublié alors d'en déduire (oui la déduction c'est un travail personnel) que si ta fonction retourne une structure, donc à priori un truc ne pouvant pas valoir 0, elle sera toujours vue comme vraie.

    Citation Envoyé par koala01 Voir le message
    il serait beaucoup plus correct (même si le texte ici n'est pas "faux") d'afficher un texte qui soit plutôt proche de printf("fonction correctement exécutée"); car c'est effectivement ce qui se sera passé
    Même une fonction renvoyant 0 peut avoir été correctement exécutée (exemple strlen(), strcmp()). Bon pardon c'était juste une parenthèse d'humour, j'ai bien compris le but principal de ta remarque

    Citation Envoyé par kaitlyn Voir le message
    Oui parce que dans la thématique des boucles temporelles c'est le film qui ressort en premier.
    En effet, c'est probablement le plus connu. Pourtant il y en a d'autres très très bons. J'ai beaucoup aimé par exemple Happy Birthdead (mais pas le 2 car comme très souvent, quand un truc a bien marché et qu'on rajoute une suite faite de bric et de broc, ça reste de bric et de broc). Il y a aussi le roman Replay que j'ai trouvé excellent...
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    J'ai beaucoup aimé par exemple Happy Birthdead (mais pas le 2 car comme très souvent, quand un truc a bien marché et qu'on rajoute une suite faite de bric et de broc, ça reste de bric et de broc).
    J'avais eu des échos pas terribles sur le 2 mais j'avais pas connaissance du 1. Donc là grâce à toi j'ai vu les deux et j'ai bien apprécié. Merci beaucoup.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/09/2019, 15h09
  2. appel d'un fonction dans un clip
    Par dom_dev dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 04/03/2010, 15h13
  3. Réponses: 4
    Dernier message: 07/03/2008, 16h21
  4. appel pointeur sur fonction dans DLL
    Par dietrich dans le forum Windows
    Réponses: 6
    Dernier message: 24/10/2007, 21h48
  5. Appel imbriqué de fonction dans onChange de SELECT
    Par toome dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 06/01/2006, 15h25

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