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 :

La définition d'une fonction ne compile pas : "error: a function-definition is not allowed here"


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Par défaut La définition d'une fonction ne compile pas : "error: a function-definition is not allowed here"
    Bonjour,

    J'ai essayé d'écrire ma première fonction en c++ mais le compilateur me renvoie les 2 erreurs suivantes :
    error: a function-definition is not allowed here before '{' token
    error: expected '}' at end of input


    J'ai relu mon code, il ne manque pas d'accolades, je suppose que ma fonction est mal déclarée ou définie mais je ne trouve pas l'erreur, pouvez-vous m'aider s'il vous plaît ?

    Voici mon code :

    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
     
    #include <iostream>
     
    using namespace std;
     
    int Jeu();
     
    int main ()
     
    {
        int NombreDeTours = 10, TourActuel = 1;
        int Jeu()
        {
            for (TourActuel = 1; TourActuel <= NombreDeTours; TourActuel++);
            {
                cout << "Tour " << TourActuel << endl;
            }
        }
        Jeu();
    }
    Merci d'avance pour vos réponses !

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    Par défaut
    Bonjour,

    L'erreur est : on ne peut pas définir une fonction ici.
    Il n'est pas possible de définir une fonction à l'intérieur d'une autre (ici la fonction main()).

  3. #3
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    en listant ton code je me suis dit que deux petites remarques supplémentaires pourraient t'aider :

    * le type que l'on met avant le nom de la fonction indique le type des donnée renvoyée par celle-ci. Ta fonction Jeu, comme ton main, sont donc censées renvoyer des entiers. Si une fonction ne doit rien retourner il faut alors la déclarer void. Pour info : le main renvoie 0 quand tout s'est bien passé, un code erreur sinon.

    * il faut revoir un peu la notion de portée pour tes variables : une fonction peu manipuler ses variables locales (déclarées à l'intérieur de la fonction), ses paramètres (qu'on lui passe lors de l'appel), les variables globales (déclarées en-dehors de toute fonction et selon l'unité de compilation) et accessoirement les variables membres si t'es dans le cadre d'une méthode d'une classe en C++.

    Bon apprentissage

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Par défaut
    D'accord... Donc il faut obligatoirement déclarer et définir les fonctions en dehors du bloc main ?

    Merci de vos conseils je le savais mais je n'ai pas fait attention

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    Par défaut
    La définition d'une fonction dans une fonction est impossible, la déclaration est possible.

    Dans le corps de la définition d'une fonction, on peut :
    * déclarer des variables externes
    * définir des variables internes (static ou pas)
    * déclarer des types internes ou externes
    * définir des types internes (tels que classes, union ou lambda)
    * définir des alias internes de types (typedef)
    * déclarer des fonctions mais pas en définir

    Dans une définition de classe ou d'union, on peut :
    * définir des variables membres
    * on ne peut pas pré-déclarer de variables ni membre, ni externes
    * déclarer des variables de classe (static), n'en définir ici que si intégral + const + non volatile
    * déclarer des types internes ou externes.
    * définir des types internes.
    * définir des alias internes de types (typedef)
    * déclarer ou définir des fonctions aussi bien membres, que de classe (static), qu'amies (friend)

    Dans l'espace global ou dans un namespace, on peut :
    * tout déclarer ou définir, y compris des namespaces.
    * mais aucun membre de classes ou d'union n'est déclarable
    * on peut définir les fonctions (static ou pas) et les variables de classe (static).

    Finalement, on peut dire que tout est possible, sauf si ça n'a pas de sens (par exemple les fonctions internes à une fonction)
    Les choses peuvent être déclarées 0, 1, N fois mais ne doivent être définies qu'une unique fois.

  6. #6
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par dalfab Voir le message
    sauf si ça n'a pas de sens (par exemple les fonctions internes à une fonction)
    C++11 introduit le support des lambda functions.
    On peut déclarer définir ces fonctions à l'intérieur d'une autre fonction (et cela a du sens).

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    En fait, non, on ne peux pas les déclarer, mais seulement les définir dans une fonction.
    Une lambda expression est une valeur d'un type non nommable (d'après le standard), et convertible en std::function<...> (ou en auto )

  8. #8
    Membre éprouvé
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Par défaut
    Cela peut sembler déroutant mais gcc autorise la définition de fonctions à l'intérieur d'une fonction, ça s'appelle les nested function, je ne vois pas trop l'intérêt vu que c'est une feature du compilateur, et hormis gcc il me semble qu'aucun autre compilateur ne permet cela (pas même clang qui est calqué sur gcc en terme d'options).

    En tout cas en C++11, on a les lambda et c'est parfait pour ce genre de cas, surtout que c'est standard.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Par défaut
    D'accord, merci pour toutes vos réponses

  10. #10
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    @leternel, Merci pour avoir relevé la typo, j'ai corrigé.
    @Danny-k, Ça dépend des options de compilation (et des versions) (pour éviter ce genre de "surprises", on peut utiliser les options -std=c++11 -pendantic)

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

Discussions similaires

  1. [SQL2005][TSQL] Problème de curseur / Fonction ne "compile" pas
    Par Ivenoproblemwiththat dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/06/2007, 21h55
  2. Réponses: 2
    Dernier message: 03/05/2007, 17h17
  3. une fonction n'attend pas la fin de la précedente
    Par Romalafrite dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 30/01/2007, 15h05
  4. Définition d'une fonction static ?
    Par tintin72 dans le forum C++
    Réponses: 9
    Dernier message: 22/12/2005, 11h50
  5. afficher la définition d'une fonction stockée
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/09/2004, 13h28

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