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 :

Traduction C++ -> Delphi


Sujet :

Langage Delphi

  1. #1
    Expert éminent sénior
    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 : 61
    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
    Points : 10 008
    Points
    10 008
    Par défaut Traduction C++ -> Delphi
    Bonjour à tous

    Comme je suis une bille en C/C++ j'avoue ne pas du tout comprendre cette ligne de code:
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    ((DWORD*)d3dlr->pBits)[(d3dlr->Pitch/4)*y+x] = data32;

    Sachant que: data32 est un DWORD, x et y des int et d3dlr est un pointeur sur une structure de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      _D3DLOCKED_RECT = packed record
        Pitch: Integer;
        pBits: Pointer; // void*
      end {_D3DLOCKED_RECT};
    Ce qui me perturbe c'est la présence de crochets. Bref je n'y comprends pas grand chose.

    Si quelqu'un parmi vous pouvait tenter une traduction.
    d'avance.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    se peut-il qu'il y ait transtypage du Pointer en tableau de Cardinal, d'où les crochets ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type 
      _D3DLOCKED_RECT = packed record
        Pitch: Integer;
        pBits: array of Cardinal; // s'il y a d'autres cast possibles, faire un record avec des case of
      end;
     
    var
      d3dlr: _D3DLOCKED_RECT;
     
    begin
      with d3dlr do pBits[Pitch/4)*y+x]:=data32;

  3. #3
    Expert éminent sénior
    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 : 61
    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
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut Tourlourou

    Après mettre creuser un peu plus la tête, tu dois très certainement avoir raison.
    Il s'agit bien d'un pointeur sur un tableau.



    @+

  4. #4
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    pBits sera effecitvement un pointeur sur tableau.


    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tbits = packed array[0..0] of byte;
    Pbits = ^TBits;

    et utilisation :
    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
     
    var
      N : integer;
      PB : PBits;
    begin
      // creation
      PB := MemAlloc(256); // Pbits = array[0..255] of byte
     
      // traitement
      for N := 0 to 255 do
        PB^[N] := N;
     
      // libération
      FreeMem(PB, 256);
    end;

    par contre attention C++ switch automatique sur l'interpretation INT/FLOAT des arguments, si cela est bon en C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Tableau[Index / 4]
    en Delphi ça ne marche pas (grosse erreur)

    il faudra ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Tableau[Trunc(index / 4)]
     
    // ou mieux
    Tableau[index div 4]
     
    // ou encore mieux optimisé 
    Tableau[index shr 2]

    ici la ligne de code nous indique que le programmeur transfer des int32 dans un tableau de int8 en interprétant le pointeur byte en pointeur int32.

    aInt8 : [0] [1] [2] [3] [4] [5] [6] [7]
    aInt32: #0{[0] [1] [2] [3]}#1{[4] [5] [6] [7]}

    ce qui reviens à faire :
    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
     
    const
      MaxBytes = 16;
      HighBytes = MaxBytes-1;
     
    type
      TInts = packed record
        case integer of
          0:(Bytes: array[0..HighBytes] of byte);
          1:(Words: array[0..HighBytes shr 1] of word);
          2:(Longs: array[0..HighBytes shr 2] of LongWord);
      end;
     
    procedure Fill;
    begin
      Ints.Longs[0] := $0102030405;
      Ints.Longs[1] := $060708090A;
    {
    Bytes[0] = 1
    Bytes[15] = 10
    }
    end;


    donc la translation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((DWORD*)d3dlr->pBits)[(d3dlr->Pitch/4)*y+x] = data32;
    devrait donner si je ne me trompe pas :

    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
     
    type
      TBytes = packed array[0..0] of byte;
      PtrBytes = ^TBytes;
     
      PD3DLR = ^TD3DLR;
      TD3DLR = packed record
        Pitch : integer;
        PBits : PtrBytes;
      end;
     
    // ... //
    var
      PtrD3DLR = PD3DLR;
    begin
      PLongWord(PtrD3DLR^.PBits^[(PtrD3DLR^.Pitch shr 2) * x+y])^ := data32;

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     { Structure for LockRect }
      PD3DLockedRect = ^TD3DLockedRect;
      _D3DLOCKED_RECT = packed record
        Pitch: Integer;
        pBits: Pointer; // void*
      end {_D3DLOCKED_RECT};
      {$EXTERNALSYM _D3DLOCKED_RECT}
      D3DLOCKED_RECT = _D3DLOCKED_RECT;
      {$EXTERNALSYM D3DLOCKED_RECT}
      TD3DLockedRect = _D3DLOCKED_RECT;
    j'ai un doute sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TBytes = packed array[0..0] of byte;
    C'est très important sur le décalage de l'offset, je penserais à un Cardinal comme tourlourou

    surtout que selon la version de Delphi, TBytes est déclaré en SysUtils
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TBytes = array of Byte;
    En utilisant un TBytes, il doit y avoir un chevauchement des Octets au sein d'un Double Mot !
    si l'on fait ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      PLongWord(PtrD3DLR^.PBits^[(PtrD3DLR^.Pitch shr 2) * x+y])^ := data32;
      PLongWord(PtrD3DLR^.PBits^[(PtrD3DLR^.Pitch shr 2) * x+y+1])^ := data32_1;
    data32_1 ne va-t-il pas écrasé 3 des Octets affecté par data32 ?
    Car le décalage dans le tableau de Byte n'est que de 1 au lieu de 4 dans un tableau de DWORD ?

    Je précise pour Cl@udius que les crochets pour les indices de tableau c'est ni plus ni moins un arithmétique de pointeur
    découpons étape par étape
    on peut écrire ^. ou . Delphi fait l'interprétation automatiquement pour un pointeur sur record, je trouve que mettre explicitement ^. aide à la lecture du code que l'on manipule du pointeur !

    Si l'on considère juste le transtypage de void* à DWORD*
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    (DWORD*)d3dlr->pBits
    En Delphi, il faut un type Tableau pour l'arithmétique des []
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    ((DWORD*)d3dlr->pBits)[...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PDWORDArray(d3dlr^.pBits)[...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      TDWORDArray = array[0..0] of DWORD;
      PDWORDArray = ^TDWORDArray;
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    ((DWORD*)d3dlr->pBits)[(d3dlr->Pitch/4)*y+x] = data32;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PDWORDArray(d3dlr^.pBits)[(d3dlr^.Pitch div 4) * y + x] = :data32;
    on peut le décomposer en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      P: PDWORD;
      OffSet: Cardinal;
    ...
      P := PDWORD(d3dlr^.pBits);
      OffSet := (d3dlr^.Pitch div 4) * y + x;
      Inc(P, OffSet * sizeof(DWORD)); // avec TBytes, cela serait sizeof(Byte) = 1 au lieu de 4, on voit la différence d'offset !
      P^ := data32;

  6. #6
    Expert éminent sénior
    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 : 61
    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
    Points : 10 008
    Points
    10 008
    Par défaut
    @Shai et Dr Who

    J"avais oublié de vous remercier pour vos explications.
    J'y vois plus clair maintenant.

  7. #7
    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
    Sinon fait gaffe avec un "array of Cardinal" pour pBits
    Il me semble qu'un array dynamique stocke sa taille, dans le sujet "Tableau Dynamique pointant sur Tableau Statiques", j'ai fait cette erreur de considérer qu'un pointeur sur un type était suffisant pour un array of type, ce qui n'est pas vrai, comme la chaine, le tableau stocke des valeurs en -4 et -8

    A bannir Length et SetLength sur ton pBits !
    Sinon en théorie ça doit fonctionner !

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

Discussions similaires

  1. Pb traduction C en Delphi
    Par chrisgood dans le forum Langage
    Réponses: 9
    Dernier message: 28/04/2010, 11h58
  2. Problème de traduction C vers Delphi
    Par BobaL dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 23/02/2009, 14h15
  3. traduction structure en Delphi (suite)
    Par skywaukers dans le forum Delphi
    Réponses: 10
    Dernier message: 15/06/2007, 22h41
  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