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 :

Fonctions utilisables dans plusieurs programmes


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut Fonctions utilisables dans plusieurs programmes
    Bonjour à tous.

    Dans cette faq, http://cpp.developpez.com/faq/cpp/?p...n-des-fichiers, nombre des fonctions décrites sont utilisables dans de nombreux programmes et on pourrait multiplier les exemples (travail avec une bdd, etc, etc)

    1) - Selon vous, quelle est la meilleure voie pour récapituler ces fonctions et pouvoir les utiliser sans avoir à les ré-écrire à chaque programme que l'on développe ?
    2) - Je ne suis certainement pas le premier à vouloir utiliser ces fonctions. Comme je ne veux pas réinventer la roue, existent-elles déjà, sous quelle forme, où sont-elles accessibles et comment les utiliser ?

    Avant de poser ces questions, j'ai pu regarder la bibliothèque STL, mais c'est le cœur de la fonction qui est disponible, pas la fonction complète. D'un autre coté, n'étant pas totalement ignorant, j'associerai bien ce que je décris à des mots comme classe, bibliothèque, statique, dynamique...

    Mais je souhaite m'engager dans la voie la plus optimale, car je ne vois pas l'articulation à mettre en œuvre, d'où ces questions vraiment béotiennes, mais non évoquées dans le cours que je pratique actuellement.

    Par avance, merci pour votre aide et expertise.

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par KonTiKI Voir le message
    Avant de poser ces questions, j'ai pu regarder la bibliothèque STL, mais c'est le cœur de la fonction qui est disponible, pas la fonction complète. D'un autre coté, n'étant pas totalement ignorant, j'associerai bien ce que je décris à des mots comme classe, bibliothèque, statique, dynamique...
    Oui il s'agit d'une bibliothèque, où l'on va piocher pour effectuer des tâches spécifiques.

    Je ne sais pas trop ce que tu entends par « cœur » et « fonction complète », déclaration et définition peut-être ? Si oui, c'est effectivement le principe d'une bibliothèque : un ensemble de « boîtes noires » dont le comportement est formalisé. L'utilisateur qui désire réaliser une tâche donnée en invoque les fonctions en respectant leurs préconditions, sans se préoccuper de leur fonctionnement interne,
    La STL est un cas un peu particulier car c'est une bibliothèque de (T)emplates dont l'implémentation, bien qu'un peu dissimulée, se trouve dans ses en-têtes.


    Citation Envoyé par KonTiKI Voir le message
    1) - Selon vous, quelle est la meilleure voie pour récapituler ces fonctions et pouvoir les utiliser sans avoir à les ré-écrire à chaque programme que l'on développe ?
    Ecris-tu déjà tant de code que tu as besoin de le factoriser ? La forme de bibliothèque la plus simple est un couple de fichier .h / .cpp. Le fichier d'en-tête contient l'interface qu'il convient d'exposer à l'utilisateur : les déclarations des fonctions qu'il peut invoquer et des types qu'il peut instancier. Le fichier .cpp contient les définitions de ces fonctions, ainsi que possiblement d'autres types et fonctions utilitaires non exposées dans l'interface. Il reste à l'utilisateur à inclure l'en-tête dans les fichiers où il a besoin d'utiliser la bibliothèque, et à ajouter le fichier d'implémentation à la commande de compilation (et le fichier objet correspondant à la commande d'édition de liens évidemment).

    Je n'aborde pas la création d'une « vraie » bibliothèque statique ou dynamique car il te faut auparavant comprendre le modèle de compilation, tu auras bien le temps d'y revenir.


    Citation Envoyé par KonTiKI Voir le message
    2) - Je ne suis certainement pas le premier à vouloir utiliser ces fonctions. Comme je ne veux pas réinventer la roue, existent-elles déjà, sous quelle forme, où sont-elles accessibles et comment les utiliser ?
    C'est un très bon réflexe de se renseigner avant de pisser du code. Il est effectivement très probable que quelqu'un ait eu besoin de la fonctionnalité avant toi. La première piste de recherche est la bibliothèque standard. Ensuite, ben comme beaucoup de choses : moteur de recherche, développez, Stack Overflow... le net quoi.


    Citation Envoyé par KonTiKI Voir le message
    Mais je souhaite m'engager dans la voie la plus optimale, car je ne vois pas l'articulation à mettre en œuvre, d'où ces questions vraiment béotiennes, mais non évoquées dans le cours que je pratique actuellement.
    Arg! Un premature optimizer, encore un ! C'est très bien de te poser des questions mais ne perd pas de temps à déjà chercher la meilleure façon de faire (si elle existe).


    Par rapport à ce fil et aux précédents que tu as ouvert, je t'invite à te renseigner sur les notions théoriques de déclaration / prototype, définition / implémentation, unité de compilation, édition de liens. Cela t'aidera à mieux appréhender le modèle C/C++ de construction d'un programme exécutable.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut
    Super ta réponse Matt_Houston. J'apprécie ton humour (même si tu préfères Linux... ).

    Pour me situer un peu, je code en amateur et autodidacte, en programmation structurée.
    J'ai débuter à programmer (en 84...) avec un langage intégré qui s'appelait FRED (plus d'info ici : https://fr.wikipedia.org/wiki/Framework_%28logiciel%29). Ensuite sous DbaseIII, DBaseIV, et un gros morceau en Access (un ERP interne). J'ai vu aussi un peu de php, de python (très peu car ça ne m'a pas plu), et un rapide passage sur Java.
    Aujourd'hui, ayant une petite application à réaliser, je me suis dit : aller, lance toi dans le C++. Il est donc possible qu'il me reste quelques vieux réflexes pour éviter d'avoir à re-bidouiller un code déjà écrit (ce pour quoi sont quand même un peu faites les classes). Comme j'envisage la possibilité de diffuser cette application, il me faut aussi essayer d'être conforme à des codes de bonne pratique. Voilà pour l'environnement général.

    Je ne sais pas trop ce que tu entends par « cœur » et « fonction complète »
    Le code suivant renvoie un booléen exploitable dans la décision ultérieure (oui ou non).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    bool is_readable( const std::string & file )  
    {  
        std::ifstream fichier( file.c_str() );  
        return !fichier.fail();  
    }
    J'ai appelé cœur de la fonction "std::ifstream" que l'on trouve donc dans la bibliothèque STD, la fonction complète teste l'existence du fichier et son accessibilité, puis renvoie une réponse exploitable. Voilà pour la petite précision, et je conçois que ma terminologie puisse être ambigüe. Et je n'ai pas trouvé cette fonction (de test) dans la STD ni ailleurs. D'où la nécessité de la coder dans mon programme, malgré que des milliers d'autres l'aient déjà fait.


    Sinon, ok pour la base En-tête/source qui semble la plus simple. Mais pour le plaisir de comprendre d'autres façons de faire (les bibliothèques ont toujours été un questionnement pour moi jusqu'à maintenant où les brumes commencent à se dissiper) je vais tenter de mettre en application les autres solutions, à titre de simple TP. Comme j'ai du temps (chose rare en ce monde moderne) je peux me permettre un peu de curiosité. Et ça fait travailler le cerveau.

    Merci pour tes réponses claires, structurées et tes excellents conseils, que je m'empresse de suivre.

    Signé : un premature optimizer.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Pour répondre à ta question , tu as des fonctionnalités que tu ne peux pas créer une fonction/ méthode avec, parce que ce sont des "comment on fait ceci - cela?":

    Comment faire pour lire un fichier ligne par ligne ?, Comment détecter la fin de fichier lors de la lecture ?, Comment écrire à la suite d'un fichier existant ?, ...

    Ensuite, il y a des fonctionnalités qui ne servent pas à grand chose (à moins d'avoir un besoin spécifique) :
    Comment calculer la taille d'un fichier ?, Comment lire l'intégralité d'un fichier texte dans un buffer ?, Comment compter le nombre de lignes d'un fichier ?, ...


    Et sinon, avec la seule fonctionnalité qui reste (Comment tester l'existence d'un fichier ?), tu peux commencer à coder un "File Manager", qui permet de se positionner dans un dossier (le "root") et de tester l'existence de fichiers/ dossiers, la création/ suppression de fichiers/ dossiers, concaténation de chemin (à partir du "root") ...

    Ceci peut-être utile parce que lorsque tu as une application, tu peux avoir des ressources externes à gérer (base de données, DLLs, ...) ou à créer (sauvegarde, ...)



    Édit: Comment lire l'intégralité d'un fichier texte dans un buffer ?, je l'utilise souvent : pour compresser un fichier, pour lire un fichier json (la bibliothèque jansson ne prend qu'un buffer en entrée, du moins il me semble), ...

    Donc essentiellement pour passer le buffer à une bibliothèque

  5. #5
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par KonTiKI Voir le message
    Le code suivant renvoie un booléen exploitable dans la décision ultérieure (oui ou non).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    bool is_readable( const std::string & file )  
    {  
        std::ifstream fichier( file.c_str() );  
        return !fichier.fail();  
    }
    J'ai appelé cœur de la fonction "std::ifstream" que l'on trouve donc dans la bibliothèque STD, la fonction complète teste l'existence du fichier et son accessibilité, puis renvoie une réponse exploitable. Voilà pour la petite précision, et je conçois que ma terminologie puisse être ambigüe. Et je n'ai pas trouvé cette fonction (de test) dans la STD ni ailleurs. D'où la nécessité de la coder dans mon programme, malgré que des milliers d'autres l'aient déjà fait.
    Bah si justement le test c'est std::ifstream::fail.
    Toi tu n'as fait qu'encapsuler cet appel.
    Et ça échouerait si le fichier est déjà ouvert. Et généralement on fait le test pour l'utiliser par la suite, donc dans un corps de fonction on appelerait que fail avec un handler et agirait en conséquence.
    Ta terminologie est ambigüe et personne ne l'utilise. Ton histoire de coeur ou non c'est du vent, tu peux toujours rajouter des indirections ou un niveau supplémentaire, c'est pas pour autant qu'il a de la plus-value.
    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.

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Je ne saisis pas non plus ta terminologie, d'autant plus problématique qu'elle crée la confusion avec celle que les développeurs utilisent (« corps de fonction »).

    Il y a une bonne raison pour que ta fonction ne se trouve pas dans la bibliothèque standard : il est impossible de savoir si les données d'un fichier sont accessibles avant d'avoir essayé d'y accéder. Ce que tu fais ici, c'est ouvrir le fichier, vérifier que tu peux lire les informations qui s'y trouvent et le refermer. C'est inefficace et vain, car il te faudra au final le rouvrir pour y accéder. Utilise directement fail ou l'opérateur de conversion vers une valeur booléenne. Si tu trouves cela verbeux, tu peux en faire une macro.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut
    bon...

    Je désire simplement tester si le fichier existe ou non et vérifier qu'il est lisible s'il existe.

    Mais visiblement cet exemple donné dans la FAQ C++ ne semble pas si "exemplaire" que cela...

    Merci en tous cas pour vos réponses.

  8. #8
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    L'entrée de la FAQ fait exactement ce qu'on attend d'elle : tester si le fichier est ouvrable en écriture.
    Mais c'est une FAQ, ça doit présenter un élément simple et un seul.
    En pratique tu ne verras pour ainsi dire jamais une telle fonction : ça ne sert en soit à rien. Parce que réouvrir le fichier derrière dans le "vrai code" pour écrire à l'intérieur est une opération à priori plus couteuse et lente que ce simple if.
    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.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut
    Merci Bousk, je comprends.

    Donc effectivement, juste un simple if comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    in_stream.open("mabase.db");
            if(!in_stream)
            {
                    // lancement de la procédure de paramétrage de l'application
            }
     
            {
            	// lancement de la procédure de connexion à la base de donnée
            }
            in_stream.close();
    Nul besoin d'encapsuler l'appel, comme tu me l'as écrit ci-dessus (et encore moins d'en faire un élément de bibliothèque).

    Merci.

  10. #10
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    En revanche si le format de ce fichier est formalisé et si tu es amené à le réutiliser, alors une bibliothèque dont le rôle est de charger les informations depuis un fichier vers une structure dédiée, effectuer des traitements et sauvegarder des données peut - par exemple - se justifier.

Discussions similaires

  1. Utiliser une fonction MATLAB dans un programme C
    Par Breep dans le forum MATLAB
    Réponses: 0
    Dernier message: 24/07/2015, 11h15
  2. Réponses: 4
    Dernier message: 05/01/2011, 19h37
  3. Fonctions utilisées dans plusieurs cs
    Par KaloOopS dans le forum C#
    Réponses: 7
    Dernier message: 06/11/2010, 17h08
  4. Plot fonction surf dans plusieurs plans
    Par AppleGuy dans le forum MATLAB
    Réponses: 2
    Dernier message: 30/06/2006, 17h59
  5. Réponses: 2
    Dernier message: 02/06/2006, 12h59

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