![]() |
Zitat:
Code:
Mit packed record:
nVerbrauch[7] : $30 (2 Bytes)
nSpritKostenL : $34 (4 Bytes)
Code:
nVerbrauch[7] : $30 (2 Bytes)
nSpritKostenL : $32 (4 Bytes) Zitat:
Kannst du mit die DLL mal schicken, dann kann ich deine Übersetzung ja mal live ausprobieren und per CPU Anzeige die fehlerhaften Sachen herausfinden. |
Moin Zusammen,
ich vermute mal, dass das hier das Problem ist: Zitat:
Vorher wurde standardmässig auf 4 Byte-Grenze ausgerichtet, ohne dass man darauf irgendeinen Einfluss hätte. |
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.
|
Moin Chewie,
logisch, aber wie willst Du sicherstellen, dass das erste Feld auf einer 8 Byte Grenze liegt? |
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. |
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++. |
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. |
Zitat:
Delphi-Quellcode:
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.
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; } |
Moin jbg,
ich sagte ja: Wenn ich mich nicht irre. Dem war aber so :mrgreen: Ich hab' den Thread inzwischen wiedergefunden. |
Meintest du
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 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