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 :

Erreur concernant l'appel d'une fonction


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Par défaut Erreur concernant l'appel d'une fonction
    Bon voici mon problème, j'essaie de développer de petit programme qui font appelle a une quelquonque fonction, par contre, je ne suis pas capable de la faire fonctionner.

    Voici mon code pour une fonction simple qui met au carré une donnée entré par l'utilisateur:

    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 <iostream>
     
    using namespace std;
     
     
    int main(int argc, char** argv) {
        int a;
        cout << "entrez une valeur de X " << endl;
        cin >> a;
        cout << "la valeur de X au carre est: " << square(a) << endl;
     
     
        int square(int x);
        {
            return x*x;
        }
     
        return (0);
    Et je reçois ces deux messages d'erreurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    newmain1.cpp:19: erreur: ‘square’ was not declared in this scope
    newmain1.cpp:24: erreur: ‘x’ was not declared in this scope
    Quelqu'un a une idée de ce que je dois modifier pour que ma fonction soit appellé correctement?

    Merci!

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    C++ n'est pas du C : il faut au moins déclarer avant ce que tu vas utiliser après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int square(int x);
    int main(int argc, char** argv) {
        int a;
        cout << "entrez une valeur de X " << endl;
        cin >> a;
        cout << "la valeur de X au carre est: " << square(a) << endl;    
        return (0); 
    }
    int square(int x)
    {
      return x*x;
    }

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    3DArchi, tu confonds pas C et Pascal ?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par bacelar Voir le message
    3DArchi, tu confonds pas C et Pascal ?
    Pas tout à fait. Longtemps, en C, le code suivant a été valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    int main(int argc, char** argv) {
        int a =2;
        printf("square(%d) = %d\n",a,square(a));
        return (0);
    }
        int square(int x)
        {
            return x*x;
        }
    Je ne me souvient pas si maintenant (C ansi), c'est toujours autorisé.
    [EDIT] : je suis en train de galérer à porter en C++ du vieux code C qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int square()
    int x;
    {
       return x*x;
    }

  5. #5
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Pas tout à fait. Longtemps, en C, le code suivant a été valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    int main(int argc, char** argv) {
        int a =2;
        printf("square(%d) = %d\n",a,square(a));
        return (0);
    }
        int square(int x)
        {
            return x*x;
        }
    Parce que ce code est valide en C.
    Mais on est pas en C, mais en C++...

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par bacelar Voir le message
    3DArchi, tu confonds pas C et Pascal ?
    Citation Envoyé par Flob91 Voir le message
    Parce que ce code est valide en C.
    Non, 3D ne confond pas, oui, le code est valide en C...

    Meme selon la norme ANSI C

    Par contre, effectivement, il fut un temps où la définition de fonction imbriquées était tout à fait légale en C...

    Maintenant, nous n'avons d'ailleurs droit qu'à un avertissement avec ISO C
    Mais on est pas en C, mais en C++...
    Effectivement, et là est toute la différence:

    C++ n'a jamais admis aucune de ces deux pratiques

    [EDIT]En fait, c'est même plus viscieux que cela...

    Si tu compile en C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(int argc, char** argv) {
     
        int square(int x)
        {
            return x*x;
        }
        int a =2;
        printf("square(%d) = %d\n",a,square(a));
        return (0);
    }
    avec uniquement le flag -ansi, il acceptera, sans même un avertissement.

    Par contre, si tu compile en C, et toujours uniquement avec le flag -ansi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(int argc, char** argv) {
     
        int a =2;
        printf("square(%d) = %d\n",a,square(a));
        int square(int x)
        {
            return x*x;
        }
        return (0);
    }
    le compilateur te jettera au motif que
    static declaration of 'square' follows non-static declaration|
    (avec meme un avertissement avant selon lequel tu as une déclaration implicite de square à la ligne du printf)

    Enfin, "tout ce que tu risque", en C, à tenter de compiler avec le flag -ansi le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    int main(int argc, char** argv) {
     
        int a =2;
        printf("square(%d) = %d\n",a,square(a));
        return (0);
    }
        int square(int x)
        {
            return x*x;
        }
    C'est un banal avertissement
    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
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Si tu compile en C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(int argc, char** argv) {
     
        int square(int x)
        {
            return x*x;
        }
        int a =2;
        printf("square(%d) = %d\n",a,square(a));
        return (0);
    }
    avec uniquement le flag -ansi, il acceptera, sans même un avertissement.
    Salut,
    Chez moi (mingw 4.4.0), sur ce code, avec la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mingw32-gcc.exe -Wall  -pedantic -W -ansi -g  -Wmain
    j'ai :
    warning: ISO C forbids nested functions
    Je ne savais même pas qu'en C c'était interdit tellement j'ai vu ce genre de choses dans du code existant.

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Chez moi (mingw 4.4.0), sur ce code, avec la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mingw32-gcc.exe -Wall  -pedantic -W -ansi -g  -Wmain
    j'ai :
    Je ne savais même pas qu'en C c'était interdit tellement j'ai vu ce genre de choses dans du code existant.
    En fait, c'est à cause des options -Wall et -pedantic...

    La premiere active tous les avertissement (et est sensé surpasser tous les autres options) la seconde active les avertissement imposées par le comité ISO, ce qui reste, me semble-t-il, encore différent de la norme ansi

    Et c'est la norme ISO C qui, maintenant, refuse les définitions de fonctions imbriquées...

    Du moins, si j'ai bien tout suivi: il faut dire qu'entre les normes ANSI (American National Standards Institute), ISO(International Standards Organisation) et POSIX(Portable Operating System Interface avec un X pour rappeler l'héritage unix), il y a parfois de quoi s'emmeler les pinceaux lorsqu'il s'agit de savoir qui dit quoi
    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

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    [HS]

    Citation Envoyé par koala01 Voir le message
    En fait, c'est à cause des options -Wall et -pedantic...

    La premiere active tous les avertissement (et est sensé surpasser tous les autres options)
    Juste une petite précision, car c'est une erreur assez courante, contrairement à ce que son nom laisse penser, -Wall n'active pas tous les warning mais seulement une partie.
    -W (ou -Wextra selon les versions) permet d'en activer certains autres.
    Et enfin, il reste une partie des warning qui ne peuvent s'activer qu'individuellement.

    A voir dans le manuel gcc pour avoir la liste des warning activés par Wall et Wextra.

    [/HS]

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je peux vous assurer que Visual, qui respecte C90, n'aime pas les fonctions imbriquées (testé sous 2005 et 2008). Il se plaint d'abord d'une extension non-standard parce qu'il trouve une déclaration de fonction dans une autre, puis crie à l'erreur de syntaxe (oubli d'un point-virgule) et considère le bloc d'instructions comme faisant partie de la fonction englobante.

    Edit: Je viens de tester sous Visual 6, il n'aime pas non plus.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je peux vous assurer que Visual, qui respecte C90, n'aime pas les fonctions imbriquées (testé sous 2005 et 2008). Il se plaint d'abord d'une extension non-standard parce qu'il trouve une déclaration de fonction dans une autre, puis crie à l'erreur de syntaxe (oubli d'un point-virgule) et considère le bloc d'instructions comme faisant partie de la fonction englobante.

    Edit: Je viens de tester sous Visual 6, il n'aime pas non plus.
    A mon avis, le plus gênant à la base du problème est qu'en C tu peux utiliser une fonction que tu n'as pas déclarée et la définir après. En C++, non. Et ça, il me semble que ça fait partie du C90, non ? (Visual et Mingw/Gcc sortent quand même un warning).

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il me semble qu'en C99, c'est (enfin!) interdit.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Erreur #Value suite appel d'une fonction Vb
    Par bru.antoine dans le forum Excel
    Réponses: 3
    Dernier message: 13/08/2012, 09h19
  2. Réponses: 4
    Dernier message: 30/08/2007, 18h08
  3. Réponses: 2
    Dernier message: 05/03/2006, 19h29
  4. Réponses: 2
    Dernier message: 01/11/2005, 18h47
  5. Erreur a l'appel d'une fonction javascript
    Par linou dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/03/2005, 11h16

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