Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C-Array/Struct nach Delphi konvertieren (https://www.delphipraxis.net/183783-c-array-struct-nach-delphi-konvertieren.html)

DCoderHH 4. Feb 2015 13:14

Delphi-Version: 5

C-Array/Struct nach Delphi konvertieren
 
Hallo alle zusammen,

ich habe eine C-DLL, die ich in Delphi nutzen möchte. Die Funktionen, die ich aufrufen möchte, habe ich schon nach Delphi übersetzt. Einer Funktion muss die folgende struct übergeben werden. Diese nach Delphi zu konvertieren klappt nicht. Es gibt eine Schutzverletzung "access violation at 0x772d0097: read of address 0x33363143"

Original C-Code:

Code:
struct s_group21diag
{
   char scode[6];
   char slokal[2];
};

struct s_group21
{
   char sgrpv[8];
   short ndiag; //Anzahl der Elemente im nachfolgenden Array
   struct s_group21diag * adiag; //Zeiger auf ein Array das mehere s_group21diag enthält
}
Meine Übersetzung nach Delphi:

Delphi-Quellcode:
type

TGroup21Diag = record
  scode: array [0 .. 5] of AnsiChar;
  slokal: array [0 .. 1] of AnsiChar;
end;
PGroup21Diag = ^TGroup21Diag;

TGroup21 = record
  sgrpv: array [0 .. 7] of AnsiChar;
  ndiag: SmallInt;
  adiag: array of PGroup21Diag;
end;
PGroup21 = ^TGroup21;
Ist adiag richtig dekaliert?

Delphi-Quellcode:
procedure Test;
begin
  New(Group21); //reicht das aus?
  EinlesenAusDatei(Group21);

  if Group21.ndiag > 0 then
    showmessage(Group21.adiag[0].scode); //Schutzverletzung hier!

  Dispose(Group21)
end;
Danke und viele Grüße!

Uwe Raabe 4. Feb 2015 13:19

AW: C-Array/Struct nach Delphi konvertieren
 
Ein array of kann man direkt auf die C-Array-Struktur mappen, da in Delphi noch andere Informationen dahinter stecken. So müsste es aber gehen. Du musst nur beim Array-Zugriff das Range-Checking ausschalten und die Array-Grenzen manuell überwachen.

Delphi-Quellcode:
type

TGroup21Diag = record
  scode: array [0 .. 5] of AnsiChar;
  slokal: array [0 .. 1] of AnsiChar;
end;

TGroup21DiagArray = array[0..0] of TGroup21Diag;
PGroup21DiagArray = ^TGroup21DiagArray;

TGroup21 = record
  sgrpv: array [0 .. 7] of AnsiChar;
  ndiag: SmallInt;
  adiag: PGroup21DiagArray;
end;
PGroup21 = ^TGroup21;

Union 4. Feb 2015 13:20

AW: C-Array/Struct nach Delphi konvertieren
 
Arbeitest Du mit Delphi 5? Dann müsstest Du noch dereferenzieren (^).

Uwe Raabe 4. Feb 2015 13:22

AW: C-Array/Struct nach Delphi konvertieren
 
Es kann auch sein, daß das Alignment der Records eine Rolle spielt. Eventuell hilft es, die Records als Packed zu deklarieren. Das hängt aber auch von den Einstellungen für die C-Struktur ab.

Union 4. Feb 2015 13:24

AW: C-Array/Struct nach Delphi konvertieren
 
Oder mal einen untypisierten genügend groß dimensionierten Puffer an die Routine übergeben und den Speicherbereich mit dem Debugger anschauen.

DCoderHH 4. Feb 2015 13:57

AW: C-Array/Struct nach Delphi konvertieren
 
Danke Uwe,

mit "array[0..0] of TGroup21Diag" klappt es!

Gruß

himitsu 4. Feb 2015 14:13

AW: C-Array/Struct nach Delphi konvertieren
 
Mit
Delphi-Quellcode:
adiag: ^TGroup21Diag; // zeige auf ersten Eintrag
wäre es auch gegangen, aber mit dem "statischen" Array ist der Zugriff einfacher/schöner und man hat auch gleich dokumentiert, daß es Mehrere gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz