Forum Programmation.c++ Je souhaite apprendre le C++

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
4
30
nov.
2021

Coucou.

Pour ma thèse en physique je dois manipuler le matlab de la mécanique des fluides numériques : OpenFoam. C'est une grosse librairie en C++.

Le problème c'est que c'est compliqué. Je renvoie vers un fichiers au hasard :
https://www.openfoam.com/documentation/guides/latest/api/fvMesh_8C_source.html

Y a 10 000 constructeurs pour chaque objet, des templates de templates de templates de classes. J'utilise seulement python comme un scientifique modeste et je ne comprends pas grand chose.

Par quoi est-ce que je dois commencer ? Avez vous des ressources/tuto à conseiller ? Comment vous avez fait pour apprendre le C++ ?

Merci.

  • # Comprendre le C++ ou OpenFoam ?

    Posté par  (site web personnel) . Évalué à 4.

    Incertain d'avoir saisi la portée des questions, voici une tentative de réponse en forme interrogative.
    Souvent pour prendre en main un système de simulation, on commence par des cas concrets et simples ne nécessitant pas la prise en main du code au-delà de la simple obtention des exécutables. C'est un premier pas qui permet souvent de comprendre quels sont les points d'entrées dans le code qui nous intéressent et qui méritent d'être approfondis. Du coup si votre problématique nécessite de prendre en main OpenFoam pour y programmer de nouveaux modèles, peut-être avez-vous commencé par là ?
    En ce qui me concerne, ayant appris le C89 — surtout durant ma thèse, au contact d'ingénieurs — je me suis auto-enseigné les bases du C++98 quand il m'a fallu écrire des cours sur le sujet (niveau archi-débutant). De là où je suis, il me semble qu'il ne devrait rien y avoir de difficile là-dedans pour qui maîtrise déjà la programmation orientée objet en Python. À une exception prêt probablement : la maîtrise des pointeurs et références. Les idiosyncrasies de la syntaxe C++ rendant la chose plus complexe à bien saisir ; sachant que c'est souvent un problème pour les débutants. Sur ce sujet je recommanderai de commencer par bien comprendre la syntaxe C des pointeurs, puis de prendre un grand bol d'humilité soumise, et de se lancer dans les références C++.
    Ne connaissant pas OpenFoam — j'ai opté pour une thèse sur les solides plutôt que les mousses quand l'occasion s'est présentée — il semble délicat de juger du niveau de C++ nécessaire pour le maîtriser. Mais le morceau de code que vous montrez ne semble pas outrageusement complexe. Vous devriez rapidement y arriver à l'aide d'un manuel basique, et en cherchant à progresser par petites étapes plutôt qu'à franchir d'un coup l'obstacle. L'idée pour attaquer un gros problème de programmation est un peu la même qu'en modélisation physique : comment découper en éléments simples.

    « IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace

    • [^] # Re: Comprendre le C++ ou OpenFoam ?

      Posté par  . Évalué à 4. Dernière modification le 30 novembre 2021 à 14:01.

      Merci pour votre réponse.

      Souvent pour prendre en main un système de simulation, on commence par des cas concrets et simples ne nécessitant pas la prise en main du code au-delà de la simple obtention des exécutables. C'est un premier pas qui permet souvent de comprendre quels sont les points d'entrées dans le code qui nous intéressent et qui méritent d'être approfondis. Du coup si votre problématique nécessite de prendre en main OpenFoam pour y programmer de nouveaux modèles, peut-être avez-vous commencé par là ?

      Je maîtrise déjà l'usage d'OpenFoam. Je l'ai utilisé de nombreuses fois et j'ai codé mon propre solveur avec les fonctions de haut niveaux d'OpenFoam. C'est assez simple lorsqu'on ne se plonge pas dans les arcanes car la syntaxe d'OpenFoam est assez proche du langage naturelle mathérmique

      Par exemple pour écrire \nabla(\vec{u}\otimes\vec{u}) +\nabla(\nu\nabla\vec{u}) = - \nabla p on écrit :

      tmp<fvVectorMatrix> tUEqn
      (
          fvm::div(phi, U)
        + fvm::laplacian(nu,U)
      );
      fvVectorMatrix& UEqn = tUEqn.ref();
      
      solve(UEqn == -fvc::grad(p));

      C'est ainsi que j'ai pu facilement répondre à mes besoins basiques. Le problème c'est de comprendre le fonctionnement interne du code qui n'est pas encore tout à faire documenté. Je n'arrive pas à le lire. Par exemple j'aimerais savoir comment est calculé un fvc:div(U) quand U est du type volVectorField. Je comprends bien que cela se passe dans ce fichier https://www.openfoam.com/documentation/guides/latest/api/fvcDiv_8C_source.html vers les lignes 77 à 95 mais je n'arrive pas à remonter les différentes fonctions jusqu'à arriver à la somme des flux sur les faces (i.e \int_\Omega \text{div}(U) ~dV \approx \sum_i U_i S_i \vec{n_i} ~dV
      J'aimerais donc apprendre le C++ afin de me retrouver là dedans et pourquoi pas pouvoir coder mes propres classes de bas niveau dans OpenFoam pour mes besoin.

      De là où je suis, il me semble qu'il ne devrait rien y avoir de difficile là-dedans pour qui maîtrise déjà la programmation orientée objet en Python. À une exception prêt probablement : la maîtrise des pointeurs et références. Les idiosyncrasies de la syntaxe C++ rendant la chose plus complexe à bien saisir ; sachant que c'est souvent un problème pour les débutants. Sur ce sujet je recommanderai de commencer par bien comprendre la syntaxe C des pointeurs, puis de prendre un grand bol d'humilité soumise, et de se lancer dans les références C++.

      Justement, j'ai beaucoup de mal avec ces références et ces pointeurs. Je ne connais pas du tout le C. Est-ce qu'il faut vraiment passer par là ?

      Vous devriez rapidement y arriver à l'aide d'un manuel basique, et en cherchant à progresser par petites étapes plutôt qu'à franchir d'un coup l'obstacle. L'idée pour attaquer un gros problème de programmation est un peu la même qu'en modélisation physique : comment découper en éléments simples.

      Merci pour le conseil. Il faut que je me trouve une bonne référence et de bons exercices pour débuter.

      EDITAI par la modération: correction suite à la demande de Jojo qui s'est foiré sur son post :-)

      • [^] # Re: Comprendre le C++ ou OpenFoam ?

        Posté par  (site web personnel) . Évalué à 2.

        Le C présente l'avantage d'une syntaxe claire pour les pointeurs : un opérateur de déréférencement (*), et un opérateur pour obtenir des adresses (&). Beaucoup ont déjà un peu de mal avec ces deux là. Le C++ reprend l'opérateur (&) pour obtenir une syntaxe plus agréable, mais en lui attribuant une nouvelle utilisation (les références). De mon point de vue ça peut embrouiller quelqu'un qui ne maîtriserait pas encore les pointeurs. D'où l'idée de passer par le C pour cette base là.

        Ceci-dit votre code n'a pas l'air de faire intensivement appel à des pointeurs, et votre problème de lecture paraît (vu de très loin) plus lié à la programmation objet (classes, héritage, templates). Du coup, il est peut-être mieux de se plonger là-dedans directement. Quitte à revenir sur les pointeurs si vous en croisez.

        À mon sens n'importe quel ouvrage traitant de ces thèmes pourrait faire l'affaire. Pour chaque notion on peut se composer soi-même des exercices si l'ouvrage n'en propose pas. Un cas simple et intuitif pourrait-être de créer des classes d'objets géométriques.

        « IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace

      • [^] # Re: Comprendre le C++ ou OpenFoam ?

        Posté par  . Évalué à 3.

        Par exemple j'aimerais savoir comment est calculé un fvc:div(U) quand U est du type volVectorField.

        Juste pour ce point particulier, tu n'as pas besoin de connaitre ou comprendre les arcanes des templates en C++ pour ça, tu peux simplement utiliser un débogueur et mettre un point d’arrêt sur la ligne en question, arrange toi pour y arriver avec le bon type (le débogueur te le dira) et entre simplement dans la fonction.
        Au bout d'une suite plus ou moins interminable d'appels intermédiaires, tu te retrouveras dans la partie algorithmique qui devrait être relativement simple à comprendre pour toi.

  • # Commencer par le C++ c'est compliqué

    Posté par  (site web personnel) . Évalué à 5.

    Salut,

    Loin de moi l'idée de te décourager mais le C++ est clairement dans le top 3 des langages les plus compliqués à maitriser au monde.

    Bien sûr tu peux rapidement faire des choses simple, mais c'est un langage tellement vaste rempli de pièges et de fonctionnalités obsolètes à connaitre.

    À l'heure actuelle je ne connais pas de ressources correctes qui permettent d'apprendre correctement le C++20 (dernière révision). Celui qui a été le plus recommandé est C++ primer de Lippman mais il couvre que le C++11.

    Dans tous les cas, suis un cours à jour et surtout pas celui du site du zero. Je pense qu'il doit y avoir des cours en ligne, il faudrait que ça couvre au minimum C++17.

    git is great because linus did it, mercurial is better because he didn't

    • [^] # Re: Commencer par le C++ c'est compliqué

      Posté par  (site web personnel) . Évalué à 2.

      « Loin de moi l'idée de te décourager mais le C++ est clairement dans le top 3 des langages les plus compliqués à maîtriser au monde. »

      Je souscris totalement. Les dépêches sur C++ m'en ont totalement convaincu. Ceci dit tempérons le propos. En physique nous avons heureusement pas mal de trains de retard en matière de programmation complexe. À la fois faute de temps à consacrer aux nouveautés de ce domaine connexe, et parce que nos usages sont souvent assez élémentaires. La plupart des codes de physique se lisent à partir de notions basiques de programmation, éventuellement matinées de parallélisme.

      « IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace

  • # ressources

    Posté par  (site web personnel, Mastodon) . Évalué à 4.

    Le wiki a une page qui devrait être un passage obligé pour se lancer : https://openfoamwiki.net/index.php/Tutorials/Before_Getting_Started et https://wiki.openfoam.com/Tutorials (en particulier le « 1st glimpse » et le « 3 weeks »)
    On y parle de l'installation et de la prise en main, nécessaires avant de bidouiller le code source. Le forum a un bon complément à partir de : https://www.cfd-online.com/Forums/openfoam/146697-getting-started-openfoam.html
    Si tu préfères une formation un peu plus classique mais en ligne, tu peux regarder par exemple https://www.udemy.com/course/openfoam-for-beginners/

    Enfin, https://holzmann-cfd.com/community/learn-openfoam après avoir fait l'historique et les diverses considérations, propose des liens vers le manuel PDF de programmation Je pense qu'en plus de l'utilisation du produit, il faut d'abord se frotter un peu à C++ et en ligne il y a quelques classiques : https://www.learn-cpp.org/ et https://www.learncpp.com/ ; ou encore https://www.w3schools.com/cpp/default.asp et https://www.tutorialspoint.com/cplusplus/index.htm et https://www.programiz.com/cpp-programming
    En formation à distance classique, on peut regarder par exemple https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c

    Je laisse d'autres compléter (liens et retours d'expérience.)

    “It is seldom that liberty of any kind is lost all at once.” ― David Hume

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.