Crunchez vos adresses URL
|
Rejoignez notre discord
|
Hébergez vos photos
Page 40 sur 182 PremièrePremière ... 3032333435363738394041424344454647485090140 ... DernièreDernière
Affichage des résultats 1 171 à 1 200 sur 5455
  1. #1171
    Bah non, c'est intéressant après tout.
    Et c'est pas non plus comme si c'était le rush le reste du temps hein. Ca nous fait du traffic.

  2. #1172
    VR & Programmation, série d'ebooks:
    https://www.humblebundle.com/books/v...-reality-books
    "Déconstruire", c'est "détruire" en insérant des "cons".
    Battle.net (Diablo 3) : Fbzn#2658 ----- / ----- / ----- Steam ID

  3. #1173
    Coincoin les coucous.

    Petite question sur CMake: je vois bien comment importer un package cherché, et même à peu près comment générer les miens.
    Par contre, j'aurais bien aimé savoir s'il y avait une variable qui me permettait de savoir dans quel répertoire se trouvent les bibliothèques .so effectivement linkées.

    Code:
    message("GDCM found")
    message("includes: ${GDCM_INCLUDE_DIRS}")
    message("libs: ${GDCM_LIBRARIES}")
    Y'a ce qui faut pour les include, et effectivement ça marche bien, mais pour les libs, y'a que le nom des libs et pas leur repertoire

  4. #1174
    Citation Envoyé par vectra Voir le message
    Coincoin les couscous.


    Boeuf ou légumes ?
    "Déconstruire", c'est "détruire" en insérant des "cons".
    Battle.net (Diablo 3) : Fbzn#2658 ----- / ----- / ----- Steam ID

  5. #1175
    Citation Envoyé par vectra Voir le message
    Coincoin les coucous.

    Petite question sur CMake: je vois bien comment importer un package cherché, et même à peu près comment générer les miens.
    Par contre, j'aurais bien aimé savoir s'il y avait une variable qui me permettait de savoir dans quel répertoire se trouvent les bibliothèques .so effectivement linkées.

    Code:
    message("GDCM found")
    message("includes: ${GDCM_INCLUDE_DIRS}")
    message("libs: ${GDCM_LIBRARIES}")
    Y'a ce qui faut pour les include, et effectivement ça marche bien, mais pour les libs, y'a que le nom des libs et pas leur repertoire
    <package>_INCLUDE_DIRS et <package>_LIBRARIES c'est la vieille manière de faire. Tout package qui se respecte se doit maintenant de déclarer des targets "IMPORTED", dont tu peux récupérer la propriété "IMPORTED_LOCATION" pour savoir de quel fichier il s'agit au juste (en plus des propriétés transitives pour donner automatiquement les bons include paths aux clients).
    "Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."

  6. #1176


    "Déconstruire", c'est "détruire" en insérant des "cons".
    Battle.net (Diablo 3) : Fbzn#2658 ----- / ----- / ----- Steam ID

  7. #1177
    Merki rOut pour l'info, je pense qu'il va falloir que je m'achète le bouquin CMake de Kitware pour me refaire un peu, en espérant qu'il soit à jour des bonnes pratiques.


    Sinon, dans la série "Vectra fait des conneries", aujourd'hui je martyrise le préprocesseur

    Voici mon problème. J'ai mon code cripplé de saloperies du genre:

    Code:
    void myfun()
    {
       vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
    
    // toujours indenté en c#0
    #if (VTK_MAJOR_VERSION >= 6)
      cubeMapper->SetInputData( inData );
    #else
      cubeMapper->SetInput( inData );
    #endif
    
    }
    En gros, l'évolution de VTK entre la V5 et la V6 s'est faite dans la douleur, et y'a une série d'appels qui ont complètement changé.
    Sous cette forme, c'est imbitable au possible, ça casse l'indentation, la lisibilité et ça m'exaspère au point que j'ai envie de dégager tout le code legacy, et je souhaite l'éviter.

    Je veux arriver à:

    Code:
    void myfun()
    {
       // indenté là où le code courant l'est 
       VTKLEGACY(  cubeMapper->SetInputData( inData ), 
                   cubeMapper->SetInput( inData )      );
    }
    , et donc avec l'appel de macro indenté correctement.
    Alors j'y suis arrivé, mais faut voir le brodel. Je vous montre, en espérant que vous me suggériez moins pire:

    vtkmacros.h:
    Code:
    #include <boost/preprocessor/control/if.hpp>
    
    #ifndef VTK_MAJOR_VERSION
    MSG_ASSERT(false, "VTK version must be declared, eg. by CMake");
    #else
    #if (VTK_MAJOR_VERSION >= 6 )
    #define VTK_MODERN 1
    #else
    #define VTK_MODERN 0
    #endif 
    #endif
    
    #define VTKLEGACY( _MODERN, _ANCIENT ) \
      BOOST_PP_IF( VTK_MODERN , \
    	       _MODERN,	    \
    	       _ANCIENT );  \
    Je masterise pas trop tellement le BOOST_PP, mais en gros, il n'aime pas true, false, ni des conditions genre (VTK_MAJOR_VERSION >= 6)
    Mais sinon voilà, ça a l'air de passer comme ça. Notez bien que la clause "ancient" ne peut simplement pas compiler sur les versions récentes de VTK, et réciproquement: il s'agit d'expander uniquement une partie de code ou une autre selon une valeur connue à la compilation (en l'occurence, définie par CMake).
    Dernière modification par vectra ; 05/07/2018 à 12h16.

  8. #1178
    Code:
    #ifndef VTK_MAJOR_VERSION
    MSG_ASSERT(false, "VTK version must be declared, eg. by CMake");
    #else
    #  if (VTK_MAJOR_VERSION >= 6 )
    #    define VTKLEGACY( _MODERN, _ANCIENT ) _MODERN
    #  else
    #    define VTKLEGACY( _MODERN, _ANCIENT ) _ANCIENT 
    #  endif 
    #endif
    Ça suffit, ou j'ai loupé une subtilité ?

  9. #1179
    Si si, c'est limpide en plus!

    En fait, j'ai cherché désespérément tout coder directement dans la macro VTKLEGACY, avant de me rendre compte qu'on peut pas expander une macro avec des directives #if..., ces dernières devant nécéssairement être en colonne 0.
    J'en suis venu à extraire des trucs de VTKLEGACY avant qu'on en arrive à ta solution, qui va jusqu'au bout de la logique.

    Ca laisse de côté la macro BOOST (dommage, j'aurais bien voulu en apprendre d'avantage là-dessus) mais il n'y a plus de définition qui traine et ça illustre bien que le préprocesseur effectue autant de passes que nécessaire, ce dont j'avais douté au début.
    Dernière modification par vectra ; 05/07/2018 à 15h52.

  10. #1180
    Par contre t'as pas besoin du préprocesseur dans chacun de tes clients.
    Crée juste une fonction inline setMapperInputData(vtkPolyDataMapper*, data) et fous le #if *dedans*. Hop, tu as encapsulé la saleté à un seul endroit et gardé une sémantique d'appel de fonction.
    Sleeping all day, sitting up all night
    Poncing fags that's all right
    We're on the dole and we're proud of it
    We're ready for 5 More Years

  11. #1181
    Ah, en fait, le problème est que *toutes* les classes ont certaines de leurs méthodes légèrement modifiées (très souvent, le même groupe de méthode pour toutes les classes).
    C'est pourquoi, dans les codes-exemple de VTK, tu as un système de directive de compilation qui va utiliser l'ancienne ou la nouvelle syntaxe. C'est généralement pas énorme comme différence, mais voilà quoi.
    Je ne pense pas pouvoir me permettre de créer une fonction à chaque fois que je dois appeler une des méthodes modifiée, c'est pourquoi je me contentais juste de travestir les directives...

  12. #1182
    Vu au taf aujourd'hui :
    Code:
    std::map<float, Data*> ma_map;

  13. #1183

  14. #1184
    Oui voilà, et puis c'est bien nommé: comme ça, tout le monde sait à qui elle est, cette map...

  15. #1185
    Yop les gens,

    J'aimerais beaucoup avoir un client stand-alone assez propre pour dépatouiller les commits et les branches de chez git.
    Quand je ramène des dépôts de gros projets, c'est pas facile à suivre sur la console, et c'est à la rigueur mieux mais pas forcément top avec Bitbucket (j'arrive à voir les branches, mais pas facilement leurs noms), qui d'ailleurs n'est pas le genre de stand-alone que je recherche.

    On m'a parlé de sourceTree et de gitKraken. Le second ne m'a pas beaucoup plu quand je l'avais essayé, et donc j'aimerais me tourner vers le premier.
    Or, ce petit bâtard n'existe pas en version Linux

    Je voulais savoir si vous aviez eu l'occasion de le faire tourner en émulation avec wine ou autre.
    Apparemment, il faut installer plusieurs runtimes avant de pouvoir le lancer sous windows, ce qui veut dire que je ne sais pas faire un truc comme ça sous Wine sans utiliser Crossover (qui est payant).
    Si vous avez des conseils ou remarques, n'hésitez pas!

  16. #1186
    GitKraken : au bureau, tous les collègues qui l'ont utilisé ont un jour ou l'autre eu des problèmes avec (lors d'un rebase interactif par exemple). Mon gros reproche à ce logiciel, c'est qu'il ne se base pas sur l'exécutale git standard, mais il fait sa propre tambouille. Sinon il est très beau, mais vala...

    SourceTree : très bien fichu, fonctionnel et stable, mais trop lent à mon goût. Ca s'est peut être arrangé avec le temps, à voir.

    Toutefois, je te conseille vivement SmartGit (https://www.syntevo.com/smartgit/). C'est une appli Java, compatible Windows Linux MacOS. Autant (sinon davantage) de fonctionnalités que SourceTree, stable, bien fichu, c'est ma GUI Git depuis plusieurs années et toujours pas déçu.
    Je l'utilise pour m'y retrouver dans les branches et commits, et faire les squash (j'aime pas le faire à la main, et SmartGit permet de sélectionner les commits, Ctrl + J, et hop ça fait un squash). Et il a un thème dark qui n'est pas trop mal.
    Pour tout le reste : IntelliJ !

  17. #1187
    SmartGit est cool en effet, mais pour 99% de l'usage quotidien la GUI intégrée des IDE Jetbrains me suffit perso.
    C'est la faute à Arteis

  18. #1188
    Perso si j'ai besoin de GUI j'utilise gitcola, c'est compatible windows (avec de la motivation) linux et mac, ça fait visualisation, merge visuel de conflits, l'interface est customisable et ça reste super léger.
    Autrement, soit 80% du temps, la CLI pour les actions simples.

  19. #1189
    Citation Envoyé par vectra Voir le message
    Je ne pense pas pouvoir me permettre de créer une fonction à chaque fois que je dois appeler une des méthodes modifiée, c'est pourquoi je me contentais juste de travestir les directives...
    Niveau perf ou niveau temps de dev ?
    Dans les deux cas, tu as intérêt à utiliser des fonctions, potentiellement inline, tu ne perdras pas ta type-safety, ton IDE et ton debugger seront plus contents, et tu ne perdras pas un iota de perf.
    Sleeping all day, sitting up all night
    Poncing fags that's all right
    We're on the dole and we're proud of it
    We're ready for 5 More Years

  20. #1190
    C'est surtout qu'on peut en écrire des centaines, entre le nombre de classes d'où la méthode est appellée et le nombre de classes qui peuvent servir d'arguments.

    Sinon: BMDJ: J'ai retrouvé le plugin Bitbucket qui était utilisé à mon ancien boulot. Il s'agit de:
    https://marketplace.atlassian.com/ap...r&tab=overview

    Et il vient tout juste de voir une version free sortir
    Cette qualitance de karma
    Dernière modification par vectra ; 12/07/2018 à 10h28.

  21. #1191
    Citation Envoyé par vectra Voir le message
    C'est surtout qu'on peut en écrire des centaines, entre le nombre de classes d'où la méthode est appellée et le nombre de classes qui peuvent servir d'arguments.
    Bon faudrait voir le code.
    Déjà au niveau des appelants c'est la même quantité de macros ou de fonctions, donc t'élimines les ifdef.
    Après pour la variabilité, j'imagine qu'il y a du polymorphisme à exploiter.
    Sleeping all day, sitting up all night
    Poncing fags that's all right
    We're on the dole and we're proud of it
    We're ready for 5 More Years

  22. #1192
    Ben, il s'agit du code de VTK, donc déjà, toutes les méthodes SetInput de chaque classe sont affectées. C'est qu'une partie du problème, parce que bien d'autres méthodes sont concernées, et là, la variabilité du code va bien au-delà.
    Je ne comprends pas très bien (*) ce que tu suggères, donc si ça se trouve, c'est bien. Mais si les gens de Kitware ont utilisé des directives de compilation pour leur propre code, c'est peut-être qu'ils n'avaient rien de mieux sous la main.


    (*): c'est ça? :

    inline void
    vtk_troubleshoot_vectra::LinkEntries(vtkPolyDataMa pper *A, typeEntréeAcceptéPar_vtkPolyDataMapper *B)
    {
    #if (VTK_MAJOR_VERSION >= 6)
    A->SetInputData( B );
    #else
    A->SetInput( B );
    #endif
    }


    using namespace vtk_troubleshoot_vectra;

    void myfun()
    {
    vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
    LinkEntries(cubeMapper, inData);
    }
    Et c'est la surcharge qui permet de faire cohabiter autant de fonctions LinkEntries que nécessaire, qui n'ont pas besoin d'être membre de quoi que ce soit.
    Dernière modification par vectra ; 12/07/2018 à 15h00.

  23. #1193
    C'est exactement ça !
    Sleeping all day, sitting up all night
    Poncing fags that's all right
    We're on the dole and we're proud of it
    We're ready for 5 More Years

  24. #1194
    C'est vrai que c'est beaucoup, beaucoup mieux comme ça, au moins pour cette méthode.
    J'avais oublié qu'il n'y avait qu'une paire de types possible par méthode SetInput(Data).

  25. #1195
    En gros si ça te baisse le nombre de #if, ça vaut le coup. Si tu dois le faire une fois pour économiser un #if, non.
    Et tu peux peut-être générer des variantes en template si tu vois des généralisations, mais moi je le ferais pas, je préfère cherry-picker les overloads.
    Sleeping all day, sitting up all night
    Poncing fags that's all right
    We're on the dole and we're proud of it
    We're ready for 5 More Years

  26. #1196
    Il y a un cours Udemy relativement complet sur le moteur Unreal Engine, pour 19 euroboules:

    https://www.udemy.com/unrealcourse/

    Bon plan ou dépense inutile?
    A noter que ça m'intéresse d'être capable de faire des trucs sur le moteur, sans forcément trop masteriser un vrai workflow de JV.

  27. #1197
    Je l'ai pris: pour 20 euros, je risque pas grand-chose.
    Par contre, pour ceux et ceusses potentiellement intéressés, la "promo" finit dans quelques jours (200 € au prix nominal).

  28. #1198
    Vectra je crois que tu utilises emacs non ? Dans ce cas Magit ne te vas pas ?

  29. #1199
    J'ai pas réussi à bien le configurer, je crois.
    Je crois surtout que j'ai besoin de quelque chose de plus graphique pour comprendre avec les mains comment ça fonctionne, git.
    J'ai déjà beaucoup progressé depuis le début de quand je m'y suis mis, mais y'a vraiment beaucoup de chemin à faire, encore.

  30. #1200
    Tiens, à propos d'emacs, je viens tout juste d'arriver à faire fonctionner correctement la completion de code
    C'est pas tout à fait simple à mettre en place en fait: ça utilise clang et CMake, et j'avais notamment pas compris pour CMake qu'il fallait lancer cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON à la main dans chaque racine de projet
    Le paquet emacs irony permet de lancer la base de la base du mode de completion, et je m'étais un peu trop perdu dans les très nombreux enrobages d'irony (e.g company-irony) qui ont été conçus pour faciliter l'usage d'irony et qui a priori fonctionnent bien... quand irony fonctionne.

    Bon, au moins, ça roule maintenant
    J'admets être à moitié teubé, mais question doc et tutos, c'est plus centré sur les enrobages que sur le fonctionnement de base. Les infos qui me manquaient n'étaient simplement pas dans le projet GitHub...
    Dernière modification par vectra ; 16/07/2018 à 17h10.

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •