Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

jbg 13. Jun 2003 15:43

Zitat:

Zitat von oki
An welcher Stelle gehen die 2 Byte verschütt?

Code:
nVerbrauch[7] : $30 (2 Bytes)
nSpritKostenL : $34 (4 Bytes)
Mit packed record:
Code:
nVerbrauch[7] : $30 (2 Bytes)
nSpritKostenL : $32 (4 Bytes)
Zitat:

Sag mir mal einer auf welchen Knopf ich für Zitat drücken muß
[ Quote ]

Kannst du mit die DLL mal schicken, dann kann ich deine Übersetzung ja mal live ausprobieren und per CPU Anzeige die fehlerhaften Sachen herausfinden.

Christian Seehase 13. Jun 2003 15:49

Moin Zusammen,

ich vermute mal, dass das hier das Problem ist:


Zitat:

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

...

/////////////////////////////////////////////////////////////////////////////
// Anordnung der Strukturelemente
/////////////////////////////////////////////////////////////////////////////
//
// Die Elemente in den Strukturen sind auf 8-Byte-Grenzen ausgerichtet.
//

...

Das geht meines Wissens in Delphi erst ab Version 7
Vorher wurde standardmässig auf 4 Byte-Grenze ausgerichtet, ohne dass man darauf irgendeinen Einfluss hätte.

Chewie 13. Jun 2003 15:54

Man kann das ganze doch emulieren, indem man nach einem 2Byte großen Element ein 6 Byte großes Fake-Feld einfügt, auf das nie zugegriffen wird.

Christian Seehase 13. Jun 2003 15:55

Moin Chewie,

logisch, aber wie willst Du sicherstellen, dass das erste Feld auf einer 8 Byte Grenze liegt?

Chewie 13. Jun 2003 16:02

Hm, daran hab ich nicht gedacht.
Aber eine Möglichkeit wär doch, 7 Records zu erstellen, jeweils mit der GRöße n+1, n+2 etc. welches dann benutzt wird, hängt von der Adresse ab. Am Anfang ist ein Fakefeld, dadurch können die eigentlichen Daten bei einer durch 8 teilbaren Adresse anfangen. Vielleicht kann das eigentliche Record irgendwie in diese Struktur kopiert werden. Beim Aufruf wird dann einfach das Record erst ab dem Beginn des ersten Feldes übergeben.

jbg 13. Jun 2003 16:11

Es ist der Funktion doch egal wo der record nun startet. Die Ausrichtung dient nur der Geschwindigkeitsoptimierung. Die Felder werden relativ zum record-Start angesprochen, womit für die Funktion kein Unterschied besteht.

Und die Struktur ist mit {$Align 4} genau so wie mit {$Align 8} unter Delphi 5/6 und C++.

Christian Seehase 13. Jun 2003 16:15

Moin jbg,

das Problem hatten wir doch vor ein paar wochen schon einmal, und, wenn ich nicht sehr irre, funktionierte es definitiv nicht, wenn die Struktur nicht auf einer 8 Byte Grenze begann.

Es gab nicht nur den von Dir beschriebenen Alignment Error der die Performance drückt, sondern die Funktion stieg mit einer Exception aus.

jbg 13. Jun 2003 16:34

Zitat:

Zitat von Christian Seehase
Es gab nicht nur den von Dir beschriebenen Alignment Error der die Performance drückt, sondern die Funktion stieg mit einer Exception aus.

Das glaube ich dir nicht. Der Code macht sicherlich nicht folgendes:
Delphi-Quellcode:
procedure MyFunc(P: PMyRec);
begin
  P := PMyRec(Integer(P) and $fffffff8); // auf 8 Bytes trimmen
  P^.xyz := 10;
end;

void MyFunc(MYRECT *p)
{
  p = p & 0xfffffff8; // auf 8 Bytes trimmen
  p->xyz = 10;
}
Denn genau das wäre nötig um eine 8 Byte Ausrichtung zu erzwingen. Und ein Programmierer der eine solche Funktion als Schnittstelle in eine DLL packt, gehört erschossen.

Christian Seehase 13. Jun 2003 16:49

Moin jbg,

ich sagte ja: Wenn ich mich nicht irre. Dem war aber so :mrgreen:

Ich hab' den Thread inzwischen wiedergefunden.

jbg 13. Jun 2003 18:09

Meintest du diesen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.
Seite 2 von 3     12 3      

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