AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C-Structure in Delphi

Ein Thema von oki · begonnen am 11. Jun 2003 · letzter Beitrag vom 24. Jun 2003
Antwort Antwort
Seite 1 von 3  1 23      
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

C-Structure in Delphi

  Alt 11. Jun 2003, 09:13
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
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: C-Structure in Delphi

  Alt 11. Jun 2003, 09:56
Vorweg: oki hat mir die Header-Dateien und Pascal-Übersetzung geschickt.


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.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3
  Alt 11. Jun 2003, 10: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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4
  Alt 11. Jun 2003, 12: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.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5
  Alt 11. Jun 2003, 13:08
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.
Angehängte Dateien
Dateityp: zip header.zip (13,2 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6
  Alt 11. Jun 2003, 15: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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7
  Alt 13. Jun 2003, 07: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
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8
  Alt 13. Jun 2003, 09: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ß.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9
  Alt 13. Jun 2003, 16: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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#10
  Alt 13. Jun 2003, 16:40
Moin oki,

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

Rechts oben in der Titelzeile eines jeden Postings zu finden.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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