Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

outils pour aider a convertir code source C++ vers python

+1 vote

Bonne resolution 2017 : un jour j' apprendrai le C++ pour ma culture...

J'ai trouvé le code source d'un blockbuster des années 90 : Dune2.
C' est en C++, en attendant d' avoir un niveau honnorable en C++ , y a til des outils pour m aider
a extraire des donnes interessantes, je pense par exemple à automatiser la traduction rapide des classes.
Avec les pointeurs je ne sais pas comment ça va se passer...

code source ici : https://sourceforge.net/projects/dunelegacy/files/dunelegacy/0.96.4/dunelegacy-0.96.4-src.tar.bz2/download

demandé 4-Jan par buffalo974 (2,284 points)

Ca me semble être le pire moyen possible pour apprendre un nouveau langage : généralement, les convertisseurs automatique de code sont a la fois contraints en expressivité et produisent un code difficile à lire et sans grand rapport a ce qu'un humain produit habituellement.

Un exemple de traduction en C, produit par cython pour traduire 3 lignes de code python :

  /* "svmloader.pyx":51
 * def load_svmfile(filename):
 *     _, ext = os.path.splitext(filename)
 *     if ext == ".gz":             # <<<<<<<<<<<<<<
 *         import gzip
 *         fp = gzip.open(filename, "rb")
 */
  __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_v_ext, __pyx_kp_s_gz, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 51, __pyx_L1_error)
  if (__pyx_t_6) {

    /* "svmloader.pyx":52
 *     _, ext = os.path.splitext(filename)
 *     if ext == ".gz":
 *         import gzip             # <<<<<<<<<<<<<<
 *         fp = gzip.open(filename, "rb")
 *     elif ext == ".bz2":
 */
    __pyx_t_1 = __Pyx_Import(__pyx_n_s_gzip, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 52, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_gzip = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "svmloader.pyx":53
 *     if ext == ".gz":
 *         import gzip
 *         fp = gzip.open(filename, "rb")             # <<<<<<<<<<<<<<
 *     elif ext == ".bz2":
 *         from bz2 import BZ2File
 */
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_gzip, __pyx_n_s_open); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 53, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = NULL;
    __pyx_t_7 = 0;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
        __pyx_t_7 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_4)) {
      PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_v_filename, __pyx_n_s_rb};
      __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
      PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_v_filename, __pyx_n_s_rb};
      __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    {
      __pyx_t_3 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 53, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      if (__pyx_t_2) {
        __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = NULL;
      }
      __Pyx_INCREF(__pyx_v_filename);
      __Pyx_GIVEREF(__pyx_v_filename);
      PyTuple_SET_ITEM(__pyx_t_3, 0+__pyx_t_7, __pyx_v_filename);
      __Pyx_INCREF(__pyx_n_s_rb);
      __Pyx_GIVEREF(__pyx_n_s_rb);
      PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_7, __pyx_n_s_rb);
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_v_fp = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "svmloader.pyx":51
 * def load_svmfile(filename):
 *     _, ext = os.path.splitext(filename)
 *     if ext == ".gz":             # <<<<<<<<<<<<<<
 *         import gzip
 *         fp = gzip.open(filename, "rb")
 */
    goto __pyx_L5;
  }

oh c' est moche !
Est-ce aussi moche dans le sens c++ => python ?

Là il ne s'agit pas d' apprendre le c++ sur ce cas, juste de pomper les classes rapidement sur lesquels je rajoute le côté interface avec pygame.

C'est faisable à la main et surement souhaitable, mais il me faut apprendre deja le c++ alors que mon objectif immediat est un recyclage du gros du code.
Sinon autre idée : C++ => UML puis UML => python . Est-ce possible avec des outils dédiés ?

Je crois que pour les jeux, il existe des convertisseurs C++ => Javascript (C'est ce qu'utilise la plupart des gros moteurs de jeu, Unity etc...), afin de pouvoir faire tourner des jeux codés à la base en C++ dans un navigateur (donc en javascript), toi qui as déjà quelques notions en JS peut-être que ça pourrait servir ...

2 Réponses

+4 votes
 
Meilleure réponse

Dans le sens C++ => python, je ne connais pas d'outil capable de faire de la "traduction". En revanche, ce qui se fait couramment, c'est d’écrire/générer un wrapper python pour du code c++.

Bien souvent, il est nécessaire de maîtriser les deux langages plus l'outil de conversion pour que tout se passe bien (c'est la cas pour Cython par exemple). Mais il existe aussi des générateurs plus ou moins automatisés pour créer des bindings.

Cette page peut t’intéresser : https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages

répondu 5-Jan par yoch (1,904 points)
sélectionné 9-Jan par buffalo974
+1 vote

pour l' instant j'ai trouvé ça :

sudo apt install doxygen-gui
doxywizard

pour la config de l' outil:
https://openclassrooms.com/forum/sujet/obtenir-schema-uml-code-c-pour-un-pythoniste

répondu 6-Jan par buffalo974 (2,284 points)
...