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 de fonction boiteux


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 111
    Par défaut Appel de fonction boiteux
    Bonjour et merci pour votre intêret et vos réponses.

    Alors j'expose le problème:
    J'ai un fichier comprenant des initialisations de variables d'entrée/sortie nommé "InOut.hh"
    Pour certaines initialisations, je dois lire un fichier XML en utilisant un parseur (xerces en l'occurence, obligé par mes supèrieurs). J'ai donc créer un fichier "LectureXML.cpp" avec ma fonction de lecture du fichier XML (LECTURE_FICHIER_DONNEES) que j'ai inclut dans mon fichier "InOut.hh".

    Mais quand dans mon .hh j'apelle ma fonction LECTURE_FICHIER_DONNEES. Le compilo me renvoie un "LECTURE_FICHIER_DONNEES was not declared in this scope"

    J'aurais aimé savoir comment le déclarer...
    En résumé mon Fichier InOut.hh ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <math.h>
    #include "LectureXML.cpp"
     
    class InOut {
    public:
    //constructeur
    //Destructeur
    //Méthode d'initialisation
    void initialize (/*signature*/)
    {
     alpha= LECTURE_FICHIER_DONNEES();
    };
    }

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 869
    Par défaut
    3 choses pour commencer :

    - Pas de protection contre la multi-inclusion (pragma once ou ifndef/define).
    - Une declaration de classe se termine par un point-virgule. Exemple :

    - Une fonction se termine par une accolade et n'a pas besoin d'etre suivi par un point-virgule. Exemple :

    Ou dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class A
    {
     int test(void)
     {
     }
    };
    Par contre une declaration de fonction se termine bien par un point virgule. Exemple :

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 111
    Par défaut
    D'accord en fait il aurait fallu que je déclare ma fonction avant la classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int LECTURE_FICHIER_DONNEES (/*signature1*/);
    classe InOut
    {
      //Constructeur
      //Destructeur
      void Initialize(/*signature2*/)
      {
          alpha= LECTURE_FICHIER_DONNEES();
      }
    };
    Et ceux même si ma fonction est dévellopé dans un fichier inclut

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Il y a un truc que je vois qui me fait très peur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "LectureXML.cpp"
    On n’inclut jamais un .cpp, et surtout pas dans un .h .

    J’espère que c’est une typo .

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 111
    Par défaut
    Ben, en fait pour le coup c'est pas une Typo. Je travaille sur un logiciel assez énorme. On me demande de créer une méthode pour initialiser des données à partir d'un fichier XML, et comme je trouve que c'est plutôt sale de coder dans un .hh, je le fais dans un .cpp, même si l'inclusion d'un cpp dans un .hh est sale aussi...
    Mais tu me dit qu'on ne dois *JAMAIS* faire ça, pourtant ça ne me sors ni warning ni erreur, est-ce juste qu'on ne dois pas le faire parce que c'est pas propre ou parce que le compilo ne le prendrai pas en compte?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    C'est tout simplement la règle.
    Les .cpp et .c sont compilés, les autres fichiers non.
    Tu utilises toutes les extensions que tu veux, mais .cpp et .c sont réservées aux fichiers compilés.
    Commencer à faire n'importe quoi n'est pas une bonne idée. Sous prétexte que ca semble marcher encore moins.
    Btw, mettre du code dans un header n'a rien de grave et ca arrive. C'est même obligatoire pour les templates.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 111
    Par défaut
    Bon, ça c'est changé maintenant c'est LectureXML.hh. Donc j'include mon LectureXML.hh dans mon InOut.hh. Merci de ton conseil

  8. #8
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Pour compléter un peu ce qu’a dit Bousk et mon propos précédent.

    - un fichier .h doit à minima respecter les contraintes suivantes :
    • on peut l’inclure plusieurs fois dans le même fichier
    • on peut l’inclure dans différents fichier du même projet sans que cela aboutisse à une erreur de link
    • il doit pouvoir être inclus indépendamment de tout autre (ceci est plus une bonne pratique qu’une obligation stricte, mais je t’encourage fortement à la respecter, ça simplifie la vie).


    C’est quasiment impossible de respecter ces contraintes avec des fichiers .cpp. Du coup, si tu inclus un .cpp dans ton header, tu casses ces propriétés.

    Pour les templates, certains préfèrent séparer interface/implémentation dans deux fichiers distincts, auquel cas, en général, on inclus le fichier implémentation (.tpp) à la fin du fichier interface (.h).

    Je t’invite à lire la FAQ là dessus pour plus de détails :

    http://cpp.developpez.com/faq/cpp/?page=projet

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Et pour parfaire le tout: seule les fonctions inline doivent se retrouver dans les fichiers d'en-tête
    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

Discussions similaires

  1. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  2. Réponses: 4
    Dernier message: 19/04/2004, 13h41
  3. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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