C++ -Calcul Scientifique- Utilisation des bibliothéques
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

C++ -Calcul Scientifique- Utilisation des bibliothéques



  1. #1
    djudje88150

    Post C++ -Calcul Scientifique- Utilisation des bibliothéques


    ------

    Bonjour,

    J’effectue beaucoup de calcul numérique scientifique. Je travail actuellement sous Matlab qui devient trop lent pour mes programmes. C’est pourquoi j’aimerai bien me mettre au C++ qui devrait être beaucoup, beaucoup plus rapide.
    J’ai lu pas mal de cours de c++ sur internet. Ce langage est très bien documenté. Cependant, dans cette méthode d’apprentissage il manque un prof capable de répondre aux questions que je me pose. C’est pourquoi j’ai choisis de poser quelques questions ici. Je sais que les réponses sont certainement dans les différents articles que j’ai pu lire mais ce n’est pas toujours très claire pour moi et je voudrais être sûr d’avoir bien compris.
    J’ai pas mal de questions (surtout relatives aux bibliothèques). Je vais donc essayer d’organiser mon post le mieux possible. Petite précisions, j’aimerai déjà, pour bien comprendre comment fonctionne le C++ travailler avec un simple éditeur de texte et un compilateur en ligne de commande (je suis sous linux).

    J’aimerai, dans la mesure du possible, ne travailler qu’avec des fichiers sources (y compris les bibliothèques) et tout recompiler à chaque fois, ceci pour deux raisons :
    _je veux stocker tout mes fichiers sources de bibliothèque dans un dossier bien déterminé .Je ne souhaite pas qu’il me génère des fichiers compilés de bibliothèques et qu’il me les stock je ne sais où. De plus, je souhaite connaitre précisément quel fichier il utilise lors de la compilation.
    _je souhaite pouvoir exécuter le code sur d’autres machine. En effet, je souhaite coder sur mon pc portable et faire quelques test pour verifier le bon fonctionnement du programme. J’aimerai ensuite prendre tout mes fichiers sources et les recompiler sur la machine qui effectuera réellement les calculs (qui est d’une architecture différente).
    Question 0 : Est-ce possible ? Je pense que oui, mais pas avec toutes les bibliothèques.

    I/ Création d’une bibliothèque personnelle

    Si j’ai bien compris, j’ai besoin :
    _de fichiers .cpp contenant mes fonctions
    _d’un fichier .h contenant les prototypes des fonctions + autre chose (je n’ai pas compris ce que c’est).

    Question I.1 : Si je met ces deux fichiers dans un répertoire contenant les librairies et que j’indique au compilateur le chemin pour trouver les bibliothèques cela fonctionnera t’il ? Bien entendu, je met le « #include » qui va bien dans mon programme principal.
    Question I.2 : Comment créer le fichier .h ? A la main, j’imagine que c’est possible. Ce n’est pas bien compliqué de définir les prototypes des fonctions mais il y a autre chose dans le .h que je n’ai pas très bien compris. Peut-on demander au compilateur de le générer ?
    Question I.3 : Doit-il y avoir un lien entre le nom du fichier .cpp et le nom de la fonction qu’il contient ? Puis-je mettre plusieurs fonction dans un même fichier .cpp ?

    II/ Utilisation d’une bibliothèque extérieur codée en C++

    Si je souhaite utiliser une bibliothèque (par exemple de calcul matriciel) codée en C++ puis-je:

    Question II.1 : trouver facilement le code source (i.e. les .cpp contenant les fonctions et le ou les fichiers .h) ?
    Question II.2 : Enregistrer simplement ces fichiers comme proposé à la question I.1 et les utiliser tel quel?

    III/ Utilisation d’une bibliothèque extérieur non codée en C++

    Bon, là ça se complique. J’imagine qu’il faut que cette bibliothèque soit compilée ou que je la compile moi-même car le compilateur c++ en sera incapable.
    Question III.1 : Une fois que cette compilation est terminée, de quels types de fichier ai-je besoin pour l’utiliser ?
    Question III.2 : Puis-je (ou dois-je) utiliser un fichier .h et des fichiers .cpp qui permettent de faire appel à cette nouvelle bibliothèque ? Est-ce ceci le « binding »?

    IV/ Appelle d’un programme installé sur l’ordinateur depuis un code C++

    Question IV : Est-il possible d’appeler un programme installé sur l’ordinateur (je pense notamment à GNUplot) depuis un code c++? Je pense que c’est possible en envoyant une commande système. Mais est-il possible de le faire en appelant des fonctions d’une bibliothèque c++ ? C’est peut-être plus cela le « binding » ?

    Ces question on pour principal but de m’aider a rester propre dans la gestion de mes fichiers, et de savoir précisément lesquels utilise le compilateur.

    Une petite dernière question : Quelle bibliothèque de tracés de graphiques me conseilleriez vous ? J’aimerai par exemple pouvoir tracer une courbe toutes les ‘n’ itérations pour surveiller la convergence d’un algorithme.

    Désolé pour ce long post. Il a néanmoins le mérite d’être claire (enfin j’espère).

    Merci par avance !

    -----

  2. #2
    galerien69

    Re : C++ -Calcul Scientifique- Utilisation des bibliothéques

    hello,

    Question 0 : Est-ce possible ? Je pense que oui, mais pas avec toutes les bibliothèques.
    Oui c'est possible si tu as accès aux sources de la bibliothèque (comprendre:
    - elle n'a pas de dépendances vers d'autres bibliothèques(sinon faudrait aussi les compiler..)
    - tu as accès aux fichiers .c, .cpp, .h, .hpp (bref tu peux taper make pour compiler)


    I/ Création d’une bibliothèque personnelle
    Si j’ai bien compris, j’ai besoin :
    _de fichiers .cpp contenant mes fonctions
    _d’un fichier .h contenant les prototypes des fonctions + autre chose (je n’ai pas compris ce que c’est).
    ....les prototypes des fonctions (implémentées dans ton .c) + plus les types utilisés (ya deux trois détails techniques, mais en gros c'est ca).
    exemple. toto.h utilise monString.h, et définit des fonctions de toto.c (qui évidemment utilisent aussi monString.h)
    Tu trouves donc les prototypes de toto.c, et aussi quelques include (de fichiers .h) et deux trois autres détails..facultatifs.

    Question I.1 : Si je met ces deux fichiers dans un répertoire contenant les librairies et que j’indique au compilateur le chemin pour trouver les bibliothèques cela fonctionnera t’il ? Bien entendu, je met le « #include » qui va bien dans mon programme principal.
    oui. + qq détails à faire, mais oui.

    Question I.2 : Comment créer le fichier .h ? A la main, j’imagine que c’est possible. Ce n’est pas bien compliqué de définir les prototypes des fonctions mais il y a autre chose dans le .h que je n’ai pas très bien compris. Peut-on demander au compilateur de le générer ?
    non le compilateur génère pas de .h.
    Un ide peut te générer un .h.
    Quant aux autres choses, ca viendra assez rapidement, et de toute manière il vaut mieux les générer à la main ou par copier coller.

    Question I.3 : Doit-il y avoir un lien entre le nom du fichier .cpp et le nom de la fonction qu’il contient ? Puis-je mettre plusieurs fonction dans un même fichier .cpp ?
    pas de lien. Autant de fonctions que tu veux.

    Question II.1 : trouver facilement le code source (i.e. les .cpp contenant les fonctions et le ou les fichiers .h) ?
    Généralement oui. Généralement tu trouves un repository git, cvs ou svn pour télécharger les sources et compiler la dite bibliothèque.
    De temps en temps tu tombes sur des librairies avec que le .h et les binaires (sources compilées) ce qui n'a pas grand intérêt si tu veux contrôler ce que tu executes!!!

    Question II.2 : Enregistrer simplement ces fichiers comme proposé à la question I.1 et les utiliser tel quel?
    Ui, tu les télécharges, tu compiles et tu as ta bibliothèque prete.
    Apres dans ton propre programme, tu spécifies que tu utilises cette bibliothèque (que tu as compilée) et c'est bon.

    Bon, là ça se complique. J’imagine qu’il faut que cette bibliothèque soit compilée ou que je la compile moi-même car le compilateur c++ en sera incapable.
    Question III.1 : Une fois que cette compilation est terminée, de quels types de fichier ai-je besoin pour l’utiliser ?
    les bibliothèques compilées générent des fichiers .so (pour linux). Dans ces .so, tu as les noms des méthodes (mangling names) que tu as dans tes .cpp. (plus le binary code bien sûr). Donc il >faut< que ces bibliothèques aient été compilées avec un compilo cpp et qu'il soit le même que le tient (je crois pas que la norme spécifie les mangling names). Bref peu de chance que tu puisses utiliser des binaires java

    Question IV : Est-il possible d’appeler un programme installé sur l’ordinateur (je pense notamment à GNUplot) depuis un code c++? Je pense que c’est possible en envoyant une commande système. Mais est-il possible de le faire en appelant des fonctions d’une bibliothèque c++ ? C’est peut-être plus cela le « binding » ?
    oui tu peux faire une commande system. (exec par exemple). Tout comme tu appèles un programme en ligne de commande.
    Tu peux également utiliser l'API d'une bibliothèque C++ qui t'affichera ta fenêtre. (genre il te faut télécharger les sources de GnuPlot et les compiler)
    Quant au mot binding j'en sais rien, je l'utilise pas pour ce contexte. Par contre tu link contre la librairie GnuPlot.

    Une petite dernière question : Quelle bibliothèque de tracés de graphiques me conseilleriez vous ? J’aimerai par exemple pouvoir tracer une courbe toutes les ‘n’ itérations pour surveiller la convergence d’un algorithme.
    Pour ma part, je trace rien en C++, les seules fois ou j'ai tracé c'était avec GNuPlot mais c'est assez immédiat. (un peu comme matlab tu passes une liste de points...)

    ton poste est très clair, j'espère que tu auras les réponses à tes questions notamment car j'approuve ta méthodologie (se renseigner avant de foncer tete baissée) et également la pertinence de tes questions.

    L'approche de conserver les sources pour pouvoir compiler sur différentes machines est également bonne (et classique).
    Seule subtilité, il te faudra coder dans la norme (pour être sur que tu sois compatibles sous plusieurs OS) (c'est généralement le cas si tu est sous linux, gcc est assez strict)
    Dernière modification par galerien69 ; 07/02/2014 à 19h42. Motif: oubli balise fermante

  3. #3
    djudje88150

    Re : C++ -Calcul Scientifique- Utilisation des bibliothéques

    Merci galerien69 pour ta réponse. Je fais réfléchir à tout cela et faire quelques tests. Mais je doit avouer que tout n'est pas encore très claire dans ma tête et je reviendrai certainement poser quelques questions.
    En voici d'ailleurs une : Quelle est selon vous la manière la plus facile pour porter un programme c++ d'une machine à une autre (d'architecture différente)? Bien entendu, ce programme utilise des bibliothèques extérieurs (je ne vais pas recoder les nombreux algorithmes déjà disponibles et très performants).

  4. #4
    djudje88150

    Re : C++ -Calcul Scientifique- Utilisation des bibliothéques

    I/ Création d’une bibliothèque personnelle
    Si j’ai bien compris, j’ai besoin :
    _de fichiers .cpp contenant mes fonctions
    _d’un fichier .h contenant les prototypes des fonctions + autre chose (je n’ai pas compris ce que c’est).
    ....les prototypes des fonctions (implémentées dans ton .c) + plus les types utilisés (ya deux trois détails techniques, mais en gros c'est ca).
    exemple. toto.h utilise monString.h, et définit des fonctions de toto.c (qui évidemment utilisent aussi monString.h)
    Tu trouves donc les prototypes de toto.c, et aussi quelques include (de fichiers .h) et deux trois autres détails..facultatifs.
    Admettons que j'ai un dossier contenant plusieurs .h et plusieurs .cpp. Je souhaite utiliser un seul .h.
    Je met dans mon code principal c++ un # include et j'indique au compilateur le chemin pour le trouver. Etant donné que dans le #include il y a le nom du fichier .h, le compilateur le trouvera facilement. Par contre, dans ce .h il n'y a rien qui indique dans quel fichier .cpp se trouvent les fonctions.

    Question I.3 : Doit-il y avoir un lien entre le nom du fichier .cpp et le nom de la fonction qu’il contient ? Puis-je mettre plusieurs fonction dans un même fichier .cpp ?
    pas de lien. Autant de fonctions que tu veux.
    Que fait alors le compilateur pour trouver le code de la fonction? Il est obligé d'ouvrir et de parcourir tout les fichiers .cpp pour trouver la fonction? Ceci parait fastidieux.

  5. A voir en vidéo sur Futura
  6. #5
    galerien69

    Re : C++ -Calcul Scientifique- Utilisation des bibliothéques

    Quelle est selon vous la manière la plus facile pour porter un programme c++ d'une machine à une autre (d'architecture différente)?
    La partie la plus dure, sera de t'assurer que les dites bibliothèques extérieures soient cross platform.
    Dès que tu commences à utiliser des bibliothèques bas niveau, (dès que ca commence à intéragir avec le hardware ou le systeme d'exploitation), alors tu t'exposes à des problèmes de compatibilité.

    Maintenant du point de vue de ton code, pour porter un programme efficacement, il te faut surtout agir sur tes méthodes de développement:
    Avoir des tests unitaires, et lancer des compilations fréquentes sur diverses architectures.

    ----

    Par contre, dans ce .h il n'y a rien qui indique dans quel fichier .cpp se trouvent les fonctions.
    Oui c'est correct.
    Que fait alors le compilateur pour trouver le code de la fonction?
    Lorsque tu crèes ton programme, tu assembles des .o.
    A chaque .cpp de ton programme correspond un unique .o.
    Lorque tu compiles ton .o, tu appèles la commande
    gcc -c fichier.cpp
    cette commande te génère un .o

    Concrètement, imagines que tu utilises une fonction de ce cpp qui est définie dans un autre .cpp.
    par exemple
    Code:
    A.cpp
    void a(){
        //du code ici
    }
    B.cpp
    void a(); //declaration
    void b(){
        a();
    }
    Lorsques tu compiles B pour avoir B.o
    le compilateur va dire: ok, le symbole a est déclaré et va laisser une référence vers a (un nom dans le .o). Sans savoir où se trouve le code de a.

    Lorsque tu vas assembler ton programme,
    gcc -o programme A.o B.o
    gcc va appeler le linker, qui va se charger de donner l'endroit ou se trouve le code de a.
    Comme a est définie dans A et que tu as compilé A.cpp en A.o et que tu as linké A (présent dans la ligne gcc -o prog A.o B.o), alors le linker va trouver le symbole A, son code associé, et permettre à B de savoir ou se trouve a.

    Tu remarques ques les .h sont pas utilisés ici.
    Mais tu remarques également dans B.cpp que tu as déclaré void a();
    Le but du .h est d'éviter d'avoir à déclarer à chaque fois ce que tu veux utiliser.
    Tu inclues le .h (qui contient la même chose) et c'est fini.
    Dernière modification par galerien69 ; 08/02/2014 à 17h05.

  7. #6
    djudje88150

    Re : C++ -Calcul Scientifique- Utilisation des bibliothéques

    Merci pour cette réponse. Desolé de ne pas pouvoir répondre rapidement. J'ai quelques problémes avec mon pc. Comme je l'ai dit plus haut, je reviendrai certainement poser des questions dés que mon systeme fonctionnera.

Discussions similaires

  1. Bibliothèques PSPICE
    Par Harry12 dans le forum Électronique
    Réponses: 4
    Dernier message: 17/05/2013, 18h09
  2. Installation bibliothèques
    Par invite93845cf6 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 20/04/2010, 13h55
  3. Bibliotheques de linux
    Par alovesupreme dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 25/11/2009, 11h35
  4. Bibliothèques
    Par invite91a05f0b dans le forum Électronique
    Réponses: 4
    Dernier message: 11/07/2006, 11h31
  5. bibliotheques
    Par invited6b42adc dans le forum Lectures scientifiques
    Réponses: 1
    Dernier message: 28/12/2005, 16h10