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 :

[Débutant] Explication des prototypes SVP


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut [Débutant] Explication des prototypes SVP
    Bonjour,

    Je suis entrain de faire quelques excercices d'un livre:

    Donc, premier excecice donne:

    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
    36
    37
     
    #include <iostream>
     
    short int z (unsigned short int x, unsigned short int y)
    {
        if (y == 0)
        {
            return -1;
        }
        else
        {
            return (x / y);
        }
    }
     
    int main()
    {
        using std::cout;
        using std::cin;
        using std::endl;
     
        int a, b, c;
     
        cout << "Entrez deux valeurs" << endl;
        cin >> a;
        cin >> b;
     
        c=z(a,b);
     
        if (c != -1)
            cout << "Le quotien est egal a: " << c << endl;
        else
            cout << "Erreur, division par 0 impossible!";
     
     
        return 0;
    }
    Donc, pas de problème pour le premier, ensuite, je commence le second:

    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
     
    #include <iostream>
     
    int fTotal (int fNombre, int fExposant);
     
    int main()
    {
        using std::cout;
        using std::cin;
        using std::endl;
     
        int Nombre, Exposant, Total;
     
        cout << "Entrez deux nombres: " << endl;
        cin >> Nombre;
        cin >> Exposant;
     
        Total = fTotal(Nombre, Exposant);
     
        cout << "Total = " << Total << endl;
     
        return 0;
    }
     
    int fTotal(int fNombre, int fExposant)
    {
        return fNombre + fExposant;
    }
    Lors du second, j'ai du faire un prototype car le compilateur me disait que fTotal n'était pas déclaré. Certes.

    J'aimerai avoir quelques explications si possible, car je ne vois vraiment pas de différence actuellement entre les 2 listings ... je suis un peu perdu.

    Quand a-ton besoin de déclarer un prototype ?

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Le compilateur lit un fichier dans l'ordre.

    Dans ton premier cas, quand il voit z dans ton main, tu lui a déjà expliqué ce que c'est donc pas de problèmes.

    Quand il voit fTotal dans ton deuxième cas sans prototype (on dit plutôt déclaration en C++), il n'a jamais vu ce nom avant, et ne sais pas s'il s'agit d'un nom de type, de fonctions (si oui, quel paramètres...), de variable... donc il bloque.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Effectivement, je viens de tester.

    Merci de l'éclaircicement, mais ça m'ammène à une autre question.

    Vaut il mieux faire ses fonctions avant le main ou après ?
    ça change quoi ?

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Disons qu'a partir d'un moment cette question ne pose plus car tu va séparer tes fonctions dans différent fichiers.
    A partir de là, il n'a plus vraiment de avant/après, il faut juste que le fichier d'où tu appelle ta fonction connaisse son prototype.

    Mais pour le moment ca ne change rien , sauf question de lisibilté.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Je vois, merci pour les réponses

  6. #6
    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,

    Tant que tu fonctionne avec un seul fichier qui contient la fonction main et toutes les autres fonctions (ce qui, entre parenthèses n'est pas le meilleur des plans ) tu risque à de nombreuses occasion de ne pas pouvoir te permettre de déclarer tes fonctions dans un ordre précis.

    Il n'est pas rare, en effet, que l'on se retrouve dans une situation dans laquelle une fonction A appelle une fonction B et que, à un moment de la logique, la fonction B doive faire appel à la fonction... A...

    C'est même parfois bien plus vicieux, d'ailleurs parce que cela peut mettre en œuvre un nombre quelconque de fonctions (A qui appelle B, qui appelle C, qui appelle D.... qui appelle A,B,C,D... au choix)

    Dans de telles circonstances, si tu décide de déclarer la fonction A avant B, elle se plaindra ... de ne pas connaitre B, et, inversement, si tu décide de mettre B avant A, elle se plaindra de ne pas connaitre...A...

    Le problème se pose d'ailleurs régulièrement quand tu travailles en Orienté Objet: Il n'est pas rare de se rendre compte qu'une classe ou une structure aie besoin d'une autre classe ou structure, et que cette autre classe ou structure aie elle même besoin de la première, même si l'une des deux n'a besoin que d'un pointeur sur l'autre

    Dans tous ces cas, tu sera dans l'obligation de déclarer la fonction, la classe ou la structure qui arrive "en deuxième position" avant la première, et d'effectuer la définition proprement dite un peu plus tard
    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

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Merci des réponses, c'est plus clair maintenant
    Donc, grosso-modo, vaut mieux que je me familiarise dès maintenant, quand je crée une fonction, de passer par un fichier header.

  8. #8
    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
    Citation Envoyé par Sagoth Voir le message
    Bonjour,

    Merci des réponses, c'est plus clair maintenant
    Donc, grosso-modo, vaut mieux que je me familiarise dès maintenant, quand je crée une fonction, de passer par un fichier header.
    Heuu... oui... on peut dire cela sous cette forme...

    A noter cependant que même avec des fichier d'en-tête, tu risque à certains moments de devoir fournir le prototype d'une fonction ou une déclaration anticipée pour une classe, parce que les inclusions croisées t'interdiront toute autre manière de faire
    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

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

Discussions similaires

  1. [EJB] [Débutant] Portabilité des EJB
    Par ruff15 dans le forum Java EE
    Réponses: 7
    Dernier message: 23/01/2008, 17h47
  2. Réponses: 2
    Dernier message: 26/01/2005, 21h00
  3. [Débutant] dessiner des carrés
    Par Dark-Lab dans le forum 2D
    Réponses: 13
    Dernier message: 27/08/2004, 10h50
  4. [Débutant] explication Servlet-TOMCAT
    Par davycrocket dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 10/05/2004, 11h13
  5. [JSP][débutant] recupérer des variables...
    Par yass dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 08/04/2004, 11h05

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