Low level code

Top  Previous  Next

What is not translated > Low level code

It is not possible to convert code automatically, that uses low level tricky pointer manipulation, which in addition may rely on the memory layout of the intrinsic Delphi types as in the following example:

 

 

procedure SetTBytesLength(var b : TBytes; len : integer);

type

  PDynArrayRec = ^TDynArrayRec;

  TDynArrayRec = packed record

    RefCnt: LongInt;

    Length: NativeInt;

  end;

var

  p : Pointer;

  oldL, minL : NativeInt;

begin

  if len = 0 then begin

    b := nil

  end

  else begin

    p := Pointer(b);

    oldL := 0;

    if p <> nil then begin

      dec(PByte(p), SizeOf(TDynArrayRec));

      oldL := PDynArrayRec(p).Length

    end;

 

    if (p = nil) or (PDynArrayRec(p).RefCnt = 1) then begin

      ReallocMem(p, SizeOf(TDynArrayRec) + len)

    end

    else begin

     ...

 

For other compilers then C++Builder Delphi2Cpp uses a std::vector as substitute for a dynamic array.std::vector has no RefCnt ond no Length element. The translation of the example case is fortunately easy because an existing method can be used.

 

void SetTBytesLength(TBytes& B, int Len)

{

  B.resize(Len);

}

 

 

 



This page belongs to the Delphi2Cpp Documentation

Delphi2Cpp home  Content