![]() |
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:
Meine Übersetzung nach Delphi:
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 }
Delphi-Quellcode:
Ist adiag richtig dekaliert?
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;
Delphi-Quellcode:
Danke und viele Grüße!
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; |
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; |
AW: C-Array/Struct nach Delphi konvertieren
Arbeitest Du mit Delphi 5? Dann müsstest Du noch dereferenzieren (^).
|
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.
|
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.
|
AW: C-Array/Struct nach Delphi konvertieren
Danke Uwe,
mit "array[0..0] of TGroup21Diag" klappt es! Gruß |
AW: C-Array/Struct nach Delphi konvertieren
Mit
Delphi-Quellcode:
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.
adiag: ^TGroup21Diag; // zeige auf ersten Eintrag
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz