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 :

Aide pour traduction C++ vers Delphi


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut Aide pour traduction C++ vers Delphi
    Bonjour à tous,

    J'ai quelques problèmes de traduction d'une fonction C++.
    Quelqu'un peut-il m'aider ?

    Voici le code C++
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pasnValue->asnValue.string.length = strlen(*(LPSTR*)pMIB->pStorageValue);
    pasnValue->asnValue.string.stream =(unsigned char*)SnmpUtilMemAlloc(pasnValue->asnValue.string.length * sizeof(char));
     
    memcpy(pasnValue->asnValue.string.stream,*(LPSTR*)pMIB->pStorageValue,pasnValue->asnValue.string.length);
    pasnValue->asnValue.string.dynamic = TRUE;
    Avec pasnValue->asnValue.string de type
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
        BYTE * stream;
        UINT   length;
        BOOL   dynamic;
    } AsnOctetString;

    Et pMIB->pStorageValue de type
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    void * pStorageValue;
    Voici ma traduction Delphi
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    asnValue.asnValue.str.length := PChar(MIB.pStorageValue);
    asnValue.asnValue.str.stream := SnmpUtilMemAlloc(asnValue.asnValue.str.length * SizeOf(Char));
     
    CopyMemory(asnValue.asnValue.str.stream, PChar(MIB.pStorageValue), Length(PChar(MIB.pStorageValue)));
    asnValue.asnValue.str.dynam := True;
    Mon problème est que je ne récupère que la première lettre de la chaîne...

    Merci pour éventuel coup de main.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    tu aurais pu donner la traduction du record AsnOctetString en delphi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... str.length := PChar(...
    Il est évident que là il y a un problème
    Length devrait être un Cardinal, Delphi accède d'affecter un PChar à un Cardinal sans transtypage explicite ???

    tu n'aurais pas écrit cela ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    asnValue.asnValue.str.length := StrLen(PChar(MIB.pStorageValue));

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     asnValue.asnValue.str := MIB.pStorageValue;


    avec str: string et pStorageValue: PChar

    vu que le code C++ ne fait que copier le PChar pStorageValue en calculant sa taille avec StrLen, puis en allouant un buffer qu'il rempli

    Delphi fait tout cela tout seul

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Oups pardon j'avais bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    asnValue.asnValue.str.length := Length(PChar(MIB.pStorageValue));
    J'ai nettoyé le code avant de la mettre sur le forum et Length est parti avec
    Je devrais utiliser StrLen plutot que Length ?

    Voici la traduction du record AsnOctetString
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      TAsnOctetString = record
        stream: PByte;
        length: UINT;
        dynam: BOOL;
      end;
    @ Paul TOTH: pStorage est type Pointer et asnValue.asnValue.str de type TAsnOctetString

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Il semble que mon problème vienne de mes PChar... La dll que je crée est instanciée par le service SNMP de Windows. Et lorsque j'ai transformé les PChar en PAnsiChar mes valeurs sont arrivées correctement...

    Il me reste à savoir pourquoi une des valeurs remonte correctement et une autre non lorsque je fais le même test sur une machine sous Windows Server 2008...?

    Sinon, un avis sur la traduction de ce code
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    case ASN_IPADDRESS:
    	pasnValue->asnValue.address.length = 4;
    	pasnValue->asnValue.string.dynamic = TRUE;
     
    	pasnValue->asnValue.address.stream[0] = ((char*)pMIB->pStorageValue)[0];
    	pasnValue->asnValue.address.stream[1] = ((char*)pMIB->pStorageValue)[1];
    	pasnValue->asnValue.address.stream[2] = ((char*)pMIB->pStorageValue)[2];
    	pasnValue->asnValue.address.stream[3] = ((char*)pMIB->pStorageValue)[3];
    	break;
    en ceci ...?
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pasnValue.asnValue.address.length := 4;
    pasnValue.asnValue.str.dynam := True;
     
    pasnValue.asnValue.address.stream[0] := Byte(PAnsiChar(MIB.pStorageValue)[0]);
    pasnValue.asnValue.address.stream[1] := Byte(PAnsiChar(MIB.pStorageValue)[1]);
    pasnValue.asnValue.address.stream[2] := Byte(PAnsiChar(MIB.pStorageValue)[2]);
    pasnValue.asnValue.address.stream[3] := Byte(PAnsiChar(MIB.pStorageValue)[3]);
    Là j'avoue que j'ai vraiment fais au pifff... J'ai cherché une combinaison de transtypages qui compile et puis c'est tout. Pour l'instant je vais essayer de la tester...

    Merci encore

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Tu ne serais en en Delphi 2009 ou plus ?

    Pour le second code, avec un structure variable tu pourrais l'écrire plus simple, ou même un CopyMemory !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Oui en Delphi 2010 (unicode).
    Ce que je comprend pas dans le dernier code c'est les stream[..] alors que stream est déclaré comme un PByte...

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Delphi est assez malin pour se dire que ton pointeur est en fait un tableau !
    le [] va faire une arithmétique des pointeurs
    Car finalement un tableau ce n'est qu'un pointeur sur la première valeur (bon, il y a une petite subtilité à ce sujet)

    C'est directement une astuce du C

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par BobaL Voir le message
    Oups pardon j'avais bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    asnValue.asnValue.str.length := Length(PChar(MIB.pStorageValue));
    J'ai nettoyé le code avant de la mettre sur le forum et Length est parti avec
    Je devrais utiliser StrLen plutot que Length ?
    StrLen() attend un PChar, Length() un string, en utilisant Length() tu demandes à Delphi de convertir le PChar en string avant d'en calculer la longueur...

    Voici la traduction du record AsnOctetString
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      TAsnOctetString = record
        stream: PByte;
        length: UINT;
        dynam: BOOL;
      end;
    @ Paul TOTH: pStorage est type Pointer et asnValue.asnValue.str de type TAsnOctetString
    as-tu un intérêt particulier à t'encombrer d'un TAsnOctetString alors que tu veux stocker un string ?

Discussions similaires

  1. Aide pour traduction DLL de C++ vers Delphi
    Par Pierre95 dans le forum Langage
    Réponses: 10
    Dernier message: 11/11/2008, 21h02
  2. Réponses: 2
    Dernier message: 04/11/2006, 00h33
  3. Réponses: 4
    Dernier message: 01/03/2006, 18h17
  4. Traduction C++ vers Delphi
    Par lil_jam63 dans le forum Langage
    Réponses: 6
    Dernier message: 05/07/2004, 13h10
  5. probleme traduction C vers Delphi
    Par zinaif dans le forum Langage
    Réponses: 3
    Dernier message: 27/06/2003, 08h51

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