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++Builder Discussion :

probleme de traduction code Delphi vers C++ [Langage/Algorithme]


Sujet :

C++Builder

  1. #1
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut probleme de traduction code Delphi vers C++
    Bonsoir
    Je traduis un programme Delphi, ce qui pose quelques problèmes.
    J'ai des variables declarees en word je pense que l'on peut les declarer en int.
    J'en ai d'autres declarees en currency je me demande si on peut les declarer en long double.
    Il y a aussi le case
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    procedure TForm1.deplacement
              (choix_moteur, choix_sens : integer; tempo : word; choix_pas : integer);
    var
    inc_x, inc_y, inc_z : integer;
    begin
    moteur := choix_moteur;
    sens := choix_sens;
    attente := trunc(tempo);
    pas := choix_pas;
    inc_x := 0; inc_y := 0; inc_z := 0; inc_pas := 0;
     {Tri pour déterminer le sens de rotation de chaque moteur}
    case choix_moteur of mx,mx+my,mx+mz,mx+my+mz :
         begin
         case choix_sens of sx,sx+sy,sx+sz,sx+sy+sz : inc_x := 1; end;
         case choix_sens of 0,sy,sz,sy+sz : inc_x := -1; end;
         end;
    end;
    je l'ai ecrit comme ceci, j'ai ce warning
    [C++ Warning] Unit1.cpp(128): W8098 Multi-character character constant
    ca compile, mais a l'execution je passe par tous les cases
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    switch(mx || mx+my || mx+mz || mx+my+mz)
    {
         case 'mx' || 'mx' + 'my' || 'mx' +' mz' || 'mx' + 'my' + 'mz' :
    switch(sx || sx+sy || sx+sz || sx+sy+sz)
         {
         case 'sx' || 'sx' + 'sy' || 'sx' + 'sz' || 'sx' + 'sy' + 'sz' :
         inc_x = 1;
         }
    switch(0 || sy || sz || sy+sz)
         {
         case '0' || 'sy' || 'sz' || 'sy' + 'sz' :
         inc_x = -1;
         }
         break;
    }
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    ta traduction est fausse
    ou sont déclarés les variables mx+my et +sx+sy
    dans ton code

    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    le type Word du Delphi existe dans C++Builder
    Si tu veux absolument le traduire, c'est unsigned short mais le typedef Word fourni par C++Builder est tout a fait valable.

    je ne comprends pas ton code C++, je ne connaissais pas cette syntaxe avec || dans un case
    Je ne suis pas très doué pour les priorité d'opérateur en C++ j'ai tendance à mettre bcp de () pour imposer ce que je veux explicitement et n'avoir aucun doute
    Sans compter les break manquants
    Ensuite ce mélange avec des 'char' et non des "chaines" d'où le warning du compilateur qui s'étonne de voir des caractères unicodes me semblent très approximatif avec les concaténations par + !


    mais si l'on traduit simplement le code Delphi suivant

    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case choix_moteur of mx,mx+my,mx+mz,mx+my+mz :
         begin
         case choix_sens of sx,sx+sy,sx+sz,sx+sy+sz : inc_x := 1; end;
         case choix_sens of 0,sy,sz,sy+sz : inc_x := -1; end;
         end;
    end;
    Pour colorer correctement [CODE=delphi] sinon dans cette section [code] correspond à [CODE=c++]

    je suppose que mx, my et mz sont des constantes, sinon je ne vois pas comment cela compilera en delphi pour respecter la sentence Un nombre, une constante déclarée ou une autre expression que le compilateur peut évaluer sans exécuter votre programme

    si l'on traduit simplement le code Delphi ci-dessus, on obtient ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
      switch (choix_moteur)
      {
        case mx :
        case mx+my :
        case mx+mz :
        case mx+my+mz :
        {
          switch (choix_sens)
          {
            case sx :
            case sx+sy :
            case sx+sz :
            case sx+sy+sz :
              inc_x = 1;
            break;
     
            case 0 :
            case sy :
            case sz :
            case sy+sz  :
              inc_x = -1;
            break;
          }
        }
        break;
      }
    Enfin si mx, my et mz sont des bits genre 0001 (1), 0010 (2) et 0100 (4), on doit pouvoir écrire cela bien plus simplement, si ce n'est pas le cas, oublie ce dernier point
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci pour vos reponses DjmSoftware et ShaiLeTroll
    Je n'ai pas pense de poster les constantes, les voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Valeurs d'affectation du choix de chaque moteur}
    const mx = 8; // Bit de sélection du moteur X}
    const my = 1; // Bit de sélection du moteur Y}
    const mz = 4; // Bit de sélection du moteur Z}
    // Valeurs d'affectation du sens de chaque moteur}
    const sx = 8; // Bit de sélection du sens déplacement +X de l'outil (-X pour le chariot longitudinal)}
    const sy = 1; // Bit de sélection du sens déplacement +Y de l'outil (-Y pour la chariot transversal)}
    const sz = 4; // Bit de sélection du sens déplacement -Z de l'outil (-Z pour la platine verticale)}
    J'ai essaye ceci qui me supprime tous les Warning
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    case mx || mx + my || mx + mz || mx + my + mz :
    si je ne me trompe pas dans les testes ( mx || mx + my ) veulent dire ( mx ou mx + my )
    La je ne peut pas tester correctement le code j'ai encore quelques erreurs a corriger
    Enfin si mx, my et mz sont des bits genre 0001 (1), 0010 (2) et 0100 (4), on doit pouvoir écrire cela bien plus simplement
    C'est le cas, si tu a une piste je suis preneur, car la je passe beaucoup de temps a traduire, de toute facon je vais essayer ta traduction
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par blondelle Voir le message
    Je n'ai pas pense de poster les constantes
    Ce n'est pas grave, la preuve en lisant le code, je l'avais deviné que c'était des champs de bit
    Je suis Delphiste à la base, je comprends le code sans soucis, je le trouve juste très mal écrit, et tu tentes de le traduire ! bon courage

    Citation Envoyé par blondelle Voir le message
    si je ne me trompe pas dans les testes ( mx || mx + my ) veulent dire ( mx ou mx + my )
    oui mais || c'est un opérateur booléen, et comme tu testes les constantes, cela donne tout vrai, tu as totalement oublié de travailler sur choix_moteur et choix_sens !

    Tu as oublié de prendre ton café !



    Citation Envoyé par blondelle Voir le message
    C'est le cas, si tu a une piste je suis preneur, car la je passe beaucoup de temps a traduire, de toute facon je vais essayer ta traduction
    Donc oui c'est bien du binaire mais la variante switch\case gère des combinaisons prédéfinies, si l'on a QUE et uniquement QUE les combinaisons que tu nous a fourni pour gérer inc_x

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (choix_moteur & mx)
      inc_x = choix_sens & sx ? 1 : -1;
    et j'ajouterais inc_y et inc_z
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (choix_moteur & my)
      inc_y = choix_sens & sy ? 1 : -1;
    if (choix_moteur & mz)
      inc_z = choix_sens & sz ? 1 : -1;
    Car si l'on regarde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        case mx :
        case mx+my :
        case mx+mz :
        case mx+my+mz :
    Si les seuls valeur possibles sont des combinaisons de mx my mz pour décider de inc_x, on voit que le seul critère c'est que le bit mx soit positionné peut importe si les autres bits le sont aussi

    Une fois mx positionné, cela veut dire que l'on bouge le moteur, sinon inc_x prend la valeur zéro
    Donc on doit bouger le moteur, dans quel sens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            case sx :         1000       
            case sx+sy :      1001
            case sx+sz :      1100
            case sx+sy+sz :   1101
            case 0 :          0000
            case sy :         0001
            case sz :         0100
            case sy+sz  :     0101
    On voit tout de suite que l'on a les 8 combinaisons possibles si l'on change 3 bit sur un quartet et que le critère sx est nécessaire pour "avancer' peu importe les autres axes en mouvement, si l'on a pas sx c'est que l'on "recule"
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci ShaiLeTroll
    je le trouve juste très mal écrit, et tu tentes de le traduire ! bon courage
    Tu ne sais pas a quel point c'est la galere des variables sont redéfinies certaines sont utilisees d'autre non des testes qui fonctionnent dans le programme une fois traduit ca ne fonctionne plus, le code est decoupe en de nombreux sous programmes dans lesquels on ne passe pour certains qu'une seule fois ....
    Mais c'est le seul code que j'ai trouve et qui est exploitable, une fois traduit et fonctionnel je vais supprimer ce qui est inutil, et revoir la partie graphique qui est pas terrible, encore des joies en perspective
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  7. #7
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    ShaiLeTroll ton code semble fonctionner, je dois terminer de debugger les dernieres erreurs pour essayer sur la fraiseuse.
    Comme l'ecriture du code que tu m'a fournie m'est inconnue, dis moi si j'ai bien compris son fonctionnement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (choix_moteur & mx)
         {
         inc_x = choix_sens & sx ? 1 : -1;
         }
     
     
    Si choix_moteur = mx
    Si choix_sens = sx
    inc_x = 1
    sinon inc_x = -1
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pas tout à fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Si le bit mx est à 1 dans choix_moteur
      Si le bit sx est à 1 dans choix_sens 
        inc_x = 1
      sinon  
        inc_x = -1
    ainsi choix_moteur peut prendre les valeurs de mx , mx+my , mx+mz et mx+my+mz c'est à dire 8 , 9 , 12 et 13 que l'on comprend mieux sous la forme 1000, 1001, 1100 et 1101, ce qui comptent c'est que l'on trouve le 1 de 1000 actif !
    ce n'est pas le cas pour 0001, 0100, 0101 et d'autres combinaisons sur un quartet de 4 bit
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci pour les reponses, le programme est pratiquement traduit, je met le post resolu
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traduction code VB6 vers PB
    Par DarkVader dans le forum PureBasic
    Réponses: 19
    Dernier message: 29/09/2010, 11h36
  2. Portage de code Delphi vers Java
    Par dtcSearch dans le forum Langage
    Réponses: 1
    Dernier message: 19/05/2010, 16h41
  3. Code Delphi vers structogramme
    Par inc002 dans le forum Langage
    Réponses: 1
    Dernier message: 20/04/2008, 13h49
  4. Réponses: 2
    Dernier message: 26/07/2007, 18h44

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