Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C-Structure in Delphi (https://www.delphipraxis.net/5556-c-structure-delphi.html)

oki 11. Jun 2003 08:13


C-Structure in Delphi
 
Hi Leute!

Das was ich gerade probiere funktioniert nicht richtig.

Ich nutzt Methodenaufrufe aus einer in C++ geschriebenen DLL und es kommt nur Blödsinn raus. Meine Vermutung ist, dass ich das Header-C-File nicht richtig übersetzt habe. Unsicher bin ich mir vorallem bei folgender Struktur:

struct RW_Fahrzeug
{
short m_Typ;
short nPrioritaet[RW_ANZ_KAT];
short nGeschwindigkeit[RW_ANZ_KAT];
unsigned short nVerbrauch[RW_ANZ_KAT];
long nSpritKostenL;
long nZeitKostenH;
long nWegKostenKM;
long nFixKosten;
long nTankfuellung;
long nTankinhalt;
long nBreite;
long nHoehe;
long nLaenge;
long nGewicht;
long nAchslast;
long nSteigung;
long nGefahrenklasse;
};

Die klare Definition von nPrioritaet bis nVerbrauch und deren Werteübergabe sind mir nicht ganz klar. Natürlich habe ich dafür eine Idee, möchte die aber erst später in die Runde schmeißen.

Zur Ausrichtung der Elemente der Struktur sind noch folgende Bemerkungen mitgegeben worden:

/////////////////////////////////////////////////////////////////////////////
// Datentypen
/////////////////////////////////////////////////////////////////////////////
//
// Konstanten: Integer (4 Bytes)
//
// Variablen:
//
// Typ Bytes
// -----------------
// int 4
// short 2
// long 4
// float 4
// double 8
//

/////////////////////////////////////////////////////////////////////////////
// Anordnung der Strukturelemente
/////////////////////////////////////////////////////////////////////////////
//
// Die Elemente in den Strukturen sind auf 8-Byte-Grenzen ausgerichtet.
//
// Die Option Struct-Member-Ausrichtung (/Zpn) steuert, wie die Elemente einer
// Struktur im Speicher abgelegt werden, und gibt dieselbe Ausrichtungsmethode
// für alle Strukturen in einem Modul an. Wenn Sie diese Option angeben, wird
// jedes Strukturelement nach dem ersten entweder in der Größe des Elementtyps
// oder innerhalb der Grenzen von n-Bytes (wobei n den Wert 1, 2, 4, 8 oder 16
// haben kann) gespeichert, je nachdem, welches Element kleiner ist.


Ich muß hier hinzufügen, dass ich Delphi 5 habe und somit über Compilerdirektive keine 8-Byte-ausrichtung erzwingen kann. Ich nutze hie die Einstellung "ausgerichtete Recordfelder". Das funktioniert an anderer Stelle tadellos. hier scheint das Problem erst mal nicht zu stecken.

Gruß oki

jbg 11. Jun 2003 08:56

Re: C-Structure in Delphi
 
Vorweg: oki hat mir die Header-Dateien und Pascal-Übersetzung geschickt.


Zitat:

Zitat von oki
Ich nutzt Methodenaufrufe aus einer in C++ geschriebenen DLL und es kommt nur Blödsinn raus.

Welche Methoden? Du hast doch gar keine Klassendeklarationen in den Header-Dateien.


Zitat:

Meine Vermutung ist, dass ich das Header-C-File nicht richtig übersetzt habe. Unsicher bin ich mir vorallem bei folgender Struktur
Da bin ich vorerst einmal anderer Meinung. Du hast einen entscheidenden Fehler bei der Aufrufkonvention der Funktionen gemacht. Das ROUTEWEG_API ist als
Code:
#define ROUTEWEG_API extern "C" __declspec (dllexport)
deklariert, was unter Delphi als stdcall bezeichnet wird. Du musst also alle cdecl durch stdcall ersetzen.



PS: Warum ich nicht auf deine PM geantwortet habe, lag daran, dass ich zum einen sehr beschäftig war und zum anderen keine Fehlerbeschreibung bei lag.

oki 11. Jun 2003 09:55

Hi jbg,

dank für die erste Antwort. Das mit dem nicht so schnell melden nehm ich dir nicht übel. Ich bin selber im Vollstreß und kann das gut verstehen.

Ich ersetz erst mal das cdecl und melde mich dann.

Gruß oki

oki 11. Jun 2003 11:03

Hi jbg,

ich hab cdecl durch stdcall ersetzt. Jetzt gehen fast alle Funktionen die im Header definiert sind mit Schreib-Lesefehlern auf Adresse in die Hose.

Ich denke stdcall war es nicht.

oki 11. Jun 2003 12:08

Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

hier noch eine Bemerkung eines C-Programmierers aus dem Hause der DLL zum Thema Elementeausrichtung.



Die Option Struct-Member-Ausrichtung (/Zpn) steuert, wie die Elemente einer Struktur im Speicher abgelegt werden, und gibt
dieselbe Ausrichtungsmethode für alle Strukturen in einem Modul an.
Wenn Sie diese Option angeben, wird jedes Strukturelement nach dem ersten entweder in der Größe des Elementtyps oder innerhalb
der Grenzen von n-Bytes (wobei n den Wert 1, 2, 4, 8 oder 16 haben kann) gespeichert, je nachdem, welches Element kleiner ist.
n ist bei uns 8, d. h. alle Variablen, die kleiner als 8 Bytes sind, werden direkt hintereinander in den Speicher geschrieben.


Soll das bedeuten ich muß packed record verwenden?

Gruß oki

P.S. Ich häng mal die Original-Header-Datei sowie meine Übersetzung ran.

oki 11. Jun 2003 14:12

Also, ich habs gerade mal mit packed record probiert. Wenn ich mir durch meine laufenden Änderungen nichts an anderer Stelle versaut hab, dann hat das nichts gebracht.

Gruß oki

oki 13. Jun 2003 06:55

Hi Leute,

derzeit hab ich folgenden Stand.

Die Records müssen als packed records deklariert und die Functionen mit cdecl importiert werden.

Somit läuft erst mal alle ohne irgentwelche Abstürze.

Leider liefert die Methode RW_Create kein Ergebnis. Meine Vermutung, dass ich die Parameter in der Struktur RW_Einstellungen für nPrioritaet, nGeschwindigkeit und nVerbrauch (wie oben als array) deklariert nicht so übergebe wie es sein muß.

Ich häng mal meinen Aufruf hier ran.

Delphi-Quellcode:
function TRouteObject.RCreate(const re: TRW_Einstellungen;
  fz: TRW_Fahrzeug; iModus: Longint): Longint;
var Count : Integer;
begin
  Result := RW_ORTAS_NO_ROUTEHANDLE;
  If FRW_WBHandle = 0 then Exit;
  for Count := 0 to 7 do begin
    fz.nPrioritaet[count] := 5;
    fz.nGeschwindigkeit[count] := 80;
    fz.nVerbrauch[count] := 9000;
  end;
  Result := RW_Create(FRW_WBHandle, re, fz, iModus);
end;
Die Schleife zum füllen der Arrays hab ich hier mal testweise eingefügt.
Der Import der Function RW_Create erfolgt bei mir so:

Delphi-Quellcode:
function RW_Create(hWB: TRW_WBHANDLE;
                   re: TRW_Einstellungen;
                   fz: TRW_Fahrzeug;
                   iModus: Longint): Longint; cdecl; external 'RouteWeg.dll';
Vielleicht sieht hier irgentwo jemand einen Fehler.

Anregungen zum testen würden mir auch schon weiter helfen. Also keine Angst wenn hier jemand eine Idee abliefert und es klappt damit nicht.

Gruß oki

jbg 13. Jun 2003 08:59

Das packed muss auf alle Fälle weg, denn dadurch schrumpft die Struktur von 104 auf 102 Bytes. Die C Struktur ist jedoch 104 Bytes groß.

oki 13. Jun 2003 15:21

Hi jbg,

ich möchte dir ja gerne glauben (und gern auch begreifen), aber bei mir funzt ohne packed gar nichts.

An welcher Stelle gehen die 2 Byte verschütt?

Und wie ist dann die Bemerkung des C-Menschen zu verstehen, dass alle Daten direkt hintereinander stehen. (Sag mir mal einer auf welchen Knopf ich für Zitat drücken muß)

Gruß oki

Christian Seehase 13. Jun 2003 15:40

Moin oki,

Zitat:

Zitat von oki
(Sag mir mal einer auf welchen Knopf ich für Zitat drücken muß)

auf den Button Zitat :mrgreen:

Rechts oben in der Titelzeile eines jeden Postings zu finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr.
Seite 1 von 3  1 23      

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