Avatar billede nop Nybegynder
07. august 2009 - 11:08 Der er 6 kommentarer og
1 løsning

Konvertering af absolute direktiv til .net platform

var
  x: word;
  bs: array[0..1] of byte absolute x;

Exsemplet er tænkt, og nemt at løse.

Men er der nogen generisk måde at lave denne Delphi variable mapping på?
Avatar billede hrc Mester
07. august 2009 - 12:15 #1
Hvis man kan få fat i adressen til data (men alle variable er jo objekter i .NET) tror jeg ville nedenstående kunne bruges:

type
  TMyArray = array[0..1] of byte;
  pTMyArray = ^TMyArray;

var
  x: word; // eller hvad det nu hedder i .NET
  PMyArray: pTMyArray;
begin
  PMyArray := x.Addr; // Findes der mon en Addr i objektet?

  PMyRect^[0] := 12;
end;


... men ellers findes lo og hi sikkert stadigvæk til at pille i nippels (bare for dette eksempel).

Strenge bliver vistnok håndteret anderledes mht. reallokering end i VCL-delphi. Hvor VCL reallokerer hele strengen mener jeg at det sker i klumper i .NET (mangler dog bekræftelse da det er lang tid siden jeg læste om .NET strenge). Er det sandt så vil mapning med en struktur ikke virke.
Avatar billede arne_v Ekspert
10. august 2009 - 00:47 #2
The .NET way for del slags er FieldOffset. Demo:

program overlay_dn;

{$APPTYPE CONSOLE}

uses
  System.Runtime.InteropServices;

type
  [StructLayout(LayoutKind.Explicit)]
  TWB = record
          [FieldOffset(0)]
          w : word;
          [FieldOffset(0)]
          b1 : byte;
          [FieldOffset(1)]
          b2 : byte;
        end;

var
  tmp : TWB;

begin
  tmp.w := 257;
  writeln(tmp.b1,' ',tmp.b2);
  readln;
end.
Avatar billede arne_v Ekspert
10. august 2009 - 00:48 #3
Og nej - man kan ikke stoppe et array ind.
Avatar billede hrc Mester
10. august 2009 - 06:18 #4
Det var vist ikke lige hvad Anders H. og co tænkte mest på da .NET blev designet. Så må man bare håbe at der ikke er lavet mange af den slags ur-pascal ting i den kode man konterverer. "Absolute" har også altid været en forkætret konstruktion (på linje med "Goto")
Avatar billede arne_v Ekspert
13. september 2009 - 03:35 #5
Tid at få afsluttet her ?
Avatar billede nop Nybegynder
18. august 2010 - 13:33 #6
arne_v vil du have points for StructLayout mv. så smid et svar.
Jeg skulle konvertere en Delphi 6 encrypt/decrypt del funktion til et licens system, endte med at få det hele konverteret til C#, hvor jeg brugte :

private struct BlockedRows
{
  public byte[] Row;
}

og så :

BlockedRows[] Block = new BlockedRows[9];

for (int b = 0; b < 9; b++)
{
    Des(ref Block[b].Row, ref Block[b].Row, ref des, false);
    ++des[1];
}

i grove træk.
Avatar billede arne_v Ekspert
18. august 2010 - 22:42 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester