Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les prototypes

    19 janvier 2020 à 10:27:17

    bonjour a tous, 

    je débute dans le C et arrivée au sujet des fonctions et prototypes, j'ai lu que si je mettais les fonctions après le main et que je n'ajoutez pas le prototypes avant ça ne fonctionnera pas hors que moi j'ai fait un test et ça marche a merveille, je vous donne le code et dites moi ce que vous en pensez.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
       choix(menu());
        return 0;
    }
    int menu()
    {
    int nombre=0;
    while(nombre <1 || nombre >4)
    {
        printf("1:poulet\n");
        printf("2:concombre\n");
        printf("3:Escalope\n");
        printf("4:surprise\n");
        printf("quel est votre choix\n");
        scanf("%d",&nombre);
    
    }
    return nombre;
    }
    
    void choix(int nombre)
    {
    switch(nombre)
    {
    case 1:
        printf("poulet\n");
        break;
    case 2:
        printf("2:concombre\n");
        break;
    case 3 :
       printf("3:Escalope\n");
       break;
    case 4:
        printf("4:surprise\n");
        break;
    }
    }


     

    • Partager sur Facebook
    • Partager sur Twitter
      19 janvier 2020 à 11:08:57

      Salut,

      Ce que j'en pense est que ça ne marche pas à merveille, ça marche à la chance. Pour commencer tu devrais avoir un warning :

      warning: implicit declaration of function 'menu' [-Wimplicit-function-declaration]|

      ce qui est annonciateur d'un "ça fonctionne, mais bon, faut faire gaffe".

      Surtout, cela empêche le compilo de vérifier que l'appel est conforme. Si tu as une fonction func(int a) et que tu l'appelles avec un argument bidon genre func("toto"), alors le compilo laissera passer puisqu'il n'est pas en mesure de savoir ce que la fonction attend.

      Avec un prototype ou une définition en amont du premier appel, le compilo va te dire : "attention, func attend un int et tu lui envoies un char*"

      Il suffit de s'en convaincre avec ce petit code simple :

      typedef struct S_Toto
      {
          int a,
              b;
      }
      Toto;
      
      int main(void)
      {
      
          Toto bidule ={.a=5, .b=10};
      
          return  mul(5*10);
      }
      
      int mul(Toto in)
      {
          return in.a * in.b;
      }

      Compile fait n'importe quoi alors que :

      typedef struct S_Toto
      {
          int a,
              b;
      }
      Toto;
      
      int mul(Toto in);
      
      int main(void)
      {
      
          Toto bidule ={.a=5, .b=10};
      
          return  mul(5*10);
      }
      
      int mul(Toto in)
      {
          return in.a * in.b;
      }

      ne compile pas et provoque une erreur d'argumentation.

      Ce ne sont pas des règles qui sont fixées au pif pour emmerder le monde.

      Même avec de l'expérience, 5, 10, ou même 50 ans de C derrière toi, tu feras des erreurs à un moment ou un autre que ce soit de l'inattention, ou une bête faute de frappe. Le compilo est là pour t'aider à trouver ces erreurs à condition qu'à ton tour, tu fasses ce qui va lui permettre de t'aider. C'est une sorte de gagnant -gagnant : aide le compilo et le compilo t'aidera.

      Bonne continuation.

      • Partager sur Facebook
      • Partager sur Twitter

      Bonhomme !! | Jeu de plateforme : Prototype.

        19 janvier 2020 à 11:21:39

        salut drx, merci pour ces explications mais tu es parti dans les détails tout ce que je veux savoir c'est que dans le tuto, ils ont dit que si tu ne mets pas avant de prototypes cela ne fonctionnera pas que le préporocesseur ne saura pas combien d'argument et tant de choses alors que pour ma part cela fonctionne sans même aucun prototype ajouté c'est ça que je ne comprend pas si tu peux me l'expliquer ??? et merci encore



        -
        Edité par solution zero 19 janvier 2020 à 11:28:14

        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2020 à 11:50:46

          Re,

          ça fonctionne parce que tes fonctions ne prennent pas d'argument, donc ce n'est pas un problème. D'ailleurs, si tu en mets un en appelant menu(34), ça fonctionnera aussi pour les raisons que j'évoque au dessus. Mais le compilo ne sait effectivement pas quels types d'arguments sont attendus.

          mon post précédent répond à ta question.

          -
          Edité par drx 19 janvier 2020 à 11:51:22

          • Partager sur Facebook
          • Partager sur Twitter

          Bonhomme !! | Jeu de plateforme : Prototype.

            20 janvier 2020 à 5:24:31

            J'appuie drx en disant que tu as de la chance.
            Comme il l'a montré, si tu définit ta fonction avec un paramèetre d'un certain type et que tu l'appelles avec n'importe quoi d'autre, tu auras n'importe quoi.
            Pour t'en convaincre, exécutes le code de drx, et tu verras.
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              20 janvier 2020 à 21:03:26

              Bonsoir

              solution zero a écrit:

              salut drx, merci pour ces explications mais tu es parti dans les détails tout ce que je veux savoir c'est que dans le tuto, ils ont dit que si tu ne mets pas avant de prototypes cela ne fonctionnera pas que le préporocesseur ne saura pas combien d'argument et tant de choses alors que pour ma part cela fonctionne sans même aucun prototype ajouté c'est ça que je ne comprend pas si tu peux me l'expliquer ??? et merci encore

              C'est une erreur du tutoriel. Comme tu l'as vu, il est possible de compiler et exécuter un tel code. Si l'on fait attention, le code va même fonctionner.
              En revanche, comme l'a montré drx, le compilateur laissera passer des erreurs très grossières qui ne passeraient pas avec un prototype. C'est donc une pratique inutilement risquée. En outre, elle ne permet pas au compilateur de convertir les arguments à l'appel, ni de récupérer autre chose qu'un int du retour.

              -
              Edité par Marc Mongenet 20 janvier 2020 à 21:03:40

              • Partager sur Facebook
              • Partager sur Twitter

              Les prototypes

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown