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

Langage Delphi Discussion :

Traduire un programme C++ en delphi


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Par défaut Traduire un programme C++ en delphi
    bonjour tout le monde,

    j'ai un programme en C++ que je dois retranscrire en delphi, cependant je bloque sur une partie du programme.
    j'aimerais savoir si quelqu'un pourrait m'aider à le traduire.
    j'utilise delphi 7 comme logiciel de programmation delphi et visual C++.net pour la lecture du programme C++.

    voici le bout de programme que je n'arrive pas à traduire:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct sdk_and_info
    {
          prUInt32m_SelectedSDK;		
          union
          {
                prDeviceInfoTable SelectedSrc_PRSDK;
                cdSourceInfo SelectedSrc_CDSDK;	
          } SrcInfo;
    } SDK_AND_INFO;
    merci de l'aide que vous pourrez m'apporté

  2. #2
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Par défaut
    j'ai oublié de préciser quelque chose, j'ai essayé de traduire le bout de programme, ce qui me donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type  SDK_AND_INFO = record
                m_SelectedSDK :prUInt32;		    
            end;
            SrcInfo = record
               case integer of
                  0: (SelectedSrc_PRSDK :prDeviceInfoTable);
                  1: (SelectedSrc_CDSDK :cdSourceInfo);	    
               end;
            end;
    cependant cela ne fonctionne pas après le "1" du case integer.
    voilà ce que je peux apporter comme précision à mon problème

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Haaa il y a donc un espace entre prUInt32 et m_SelectedSDK (cf premier post )

    Moi je dirais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type  SDK_AND_INFO = record
      m_SelectedSDK :prUInt32;
      case SrcInfo: Integer of
        0: (SelectedSrc_PRSDK: prDeviceInfoTable);
        1: (SelectedSrc_CDSDK: cdSourceInfo);
      end;
    end;
    Maintenant c'est vrai que la syntaxe qui s'approche le plus du union C++ c'est le Case Of dans les Record au vu de ce que j'ai lu mais pourtant j'ai pas le sentiment que ça fasse exactement la même chose, à tester donc...

  4. #4
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Par défaut
    je viens de tester le programme et lors de la compilation j'ai toujours le même message d'érreur au niveau de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1: (SelectedSrc_CDSDK: cdSourceInfo);
    le message d'erreur est le suivant :
    le type 'cdSourceInfo' nécessite une finalisation-non autorisé dans l'enregistrement variant
    je n'arrive pas à trouvé ce que le message d'erreur souhaite que je rajoute étant donné que le cdSourceInfo à bien été déclaré auparavant.

    merci de votre aide Aka Guymelef

  5. #5
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut

    cdSourceInfo doit vraisemblablement être de type String (ou manipuler un string). Ce qui malheureusement n'est pas autorisé dans la partie variable d'un record.

    @+ Claudius

  6. #6
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Par défaut
    voici la déclaration de 'cdSourceInfo' en c++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct{
    	cdSourceType		SurceType;				/* Type of the device                   */
    	cdUInt32			rsrvd;					/* Reserved		                        */
    	cdStr63				Name;					/* Device model name 
    												   (invalid if cdSRC_TYPE_HOST)         */
    	#ifndef macintosh
    	cdStr63				NameInOS;				/* Device model name in OS				*/
    	#endif
    	cdPortType			PortType;				/* Port type                            */
    	cdPortDescripUnion	u;						/* Union of I/O port descriptor         */
    } cdSourceInfo;
    et voici ce que j'ai réalisé en delphi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
        cdSourceInfo = record
        SurceType:cdSourceType;        {* Type of the device                        *}
        rsrvd   :cdUInt32;             {* Reserved	                                *}
        Name    :cdStr63;              {* Device model name
                                                    (invalid if cdSRC_TYPE_HOST)    *}
        NameInOS:cdStr63;              {* Device model name in OS              *}
        PortType:cdPortType;           {* Port type                            *}
        u       :cdPortDescripUnion;   {* Union of I/O port descriptor         *}
      end;
    effectivement je remarque bien que le cdsourceinfo manipule un string 'cdStr63'.

    que faudrait-il que je fasse pour pouvoir ainsi traduire correctement le programme c++ en delphi afin d'utilisé le case of pour le 'cdsourceinfo' sans utiliser de string

  7. #7
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour,
    le case of dans les record permet bien d'obtenir la même fonctionnalité que les unions du C/C++.

    Il ne peut contenir aucun type necessitant une finalisation (string, mais aussi interfaces, tableaux dynamiques ...). En effet, le compilateur génère un code de libération pour ces types (plus précisément une décrémentation d'un compteur de référence suivi d'une libération en cas de compteur à zéro).
    Une partie variable contenant plusieurs types différents partageant le même espace mémoire, le compilateur ne peut savoir si il doit ou pas effectuer sa finalisation sur ces types. Ils sont donc interdits dans une partie variable.

    Attention écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case SrcInfo: Integer of
    rajoute une variable SrcInfo de type Integer dans le record (=> décalage des champs par rapport à la structure C) contrairement à

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 489
    Par défaut
    salut

    a priori tes cdStr63 devrai correspondre a des "shortstring"
    ou des truc du genre STRING[64]

    @+ Phil

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Merci pour ces précisions gb_68 .

    A partir de là il faut voir qu'est-ce que tu veux réellement faire de ce Record vu que tu ne vas pas pouvoir le recréer à l'identique par rapport au C++. Si tu ne vas t'en servir qu'uniquement dans ton programme alors il va falloir opter pour une vision différente (plusieurs records sans partie variable, classe, etc...).

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 489
    Par défaut
    salut ,

    arf je n'avait pas fait attention
    Citation Envoyé par Aka Guymelef Voir le message
    Haaa il y a donc un espace entre prUInt32 et m_SelectedSDK (cf premier post )

    Moi je dirais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type  SDK_AND_INFO = record
      m_SelectedSDK :prUInt32;
      case SrcInfo: Integer of
        0: (SelectedSrc_PRSDK: prDeviceInfoTable);
        1: (SelectedSrc_CDSDK: cdSourceInfo);
      end;
    end;
    Maintenant c'est vrai que la syntaxe qui s'approche le plus du union C++ c'est le Case Of dans les Record au vu de ce que j'ai lu mais pourtant j'ai pas le sentiment que ça fasse exactement la même chose, à tester donc...
    y'a un end de trop
    dans un record le end du record détermine la fin du case

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type  SDK_AND_INFO = record
      m_SelectedSDK :prUInt32;
      case SrcInfo: Integer of
        0: (SelectedSrc_PRSDK: prDeviceInfoTable);
        1: (SelectedSrc_CDSDK: cdSourceInfo);
    end;

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

Discussions similaires

  1. Traduire un programme
    Par cjacquel dans le forum Windows
    Réponses: 1
    Dernier message: 17/05/2006, 12h41
  2. Programmation CICS sous Delphi
    Par Laurent Dardenne dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 08/12/2005, 11h29
  3. A la sortie de la programmation DOS, WINDEV ? DELPHI ? ou ?
    Par zanimox dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 18/08/2005, 17h25
  4. Questions sur la programmation objet en Delphi
    Par Manopower dans le forum Débuter
    Réponses: 20
    Dernier message: 15/06/2005, 15h39
  5. Programmation WEB avec delphi
    Par mayoguy dans le forum Web & réseau
    Réponses: 4
    Dernier message: 20/08/2002, 19h03

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