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 2 von 3     12 3      
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#11
  Alt 13. Jun 2003, 16:43
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

ich vermute mal, dass das hier das Problem ist:


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.
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
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#13
  Alt 13. Jun 2003, 16: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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

logisch, aber wie willst Du sicherstellen, dass das erste Feld auf einer 8 Byte Grenze liegt?
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
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#15
  Alt 13. Jun 2003, 17: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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#16
  Alt 13. Jun 2003, 17: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++.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#17
  Alt 13. Jun 2003, 17: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.
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
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#18
  Alt 13. Jun 2003, 17:34
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#19
  Alt 13. Jun 2003, 17:49
Moin jbg,

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

Ich hab' den Thread inzwischen wiedergefunden.
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
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#20
  Alt 13. Jun 2003, 19:09
Meintest du diesen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 08:37 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