![]() |
Record: Delphi only?
Hi DPler
Hab mal eine Frage ist ein record also sowas:
Delphi-Quellcode:
Ist das was Delphi eigenes oder gibts sowas in z.b. c, c++, vb, ... auch das komplett gleich aufgebaut ist?
type
TIrgendwas = record EinString : String; EinInteger : Integer; end; Also wenn ich jetzt einer c dll oder einer delphi dll einen pointer auf ein record gebe können des dann beide dlls ohne probs auslesen? |
Re: Record: Delphi only?
Dein Record ist Delphieigen weil ein String enthalten ist. Ansonsten sind Records nichts Delphieigenes. Records spezifizieren einfach den Aufbau von hintereinander liegenden Daten. Alles was in deinem Record ist liegt also im speicher hintereinander. Wenn du Pointer im Record hast liegt das wo der pointer hinzeigt natürlich nicht mit dabei.
|
Re: Record: Delphi only?
Zitat:
Zitat:
|
Re: Record: Delphi only?
Zitat:
Gruß Der Unwissende |
Re: Record: Delphi only?
Also wenn ich des so scheib:
Delphi-Quellcode:
dann geht des überall oder?
type
TIrgendwas = record EinPChar : PChar; EinInteger : Integer; end; |
Re: Record: Delphi only?
genau der Record ist perfekt und dürfte keine Probleme bei DLL-Arbeiten bereiten.
|
Re: Record: Delphi only?
ok danke :thumb:
werd des jetzt versuchen und wenn ich probleme hab meld ich mich wieder :zwinker: |
Re: Record: Delphi only?
Zitat:
Gruß Hawkeye |
Re: Record: Delphi only?
Das align sollte schon beachtet werden. Es ging ja aber darum ob der Record Delphi eigen ist. Die Ausrichtung kann man später im c++ programm ja noch festlegen.
|
Re: Record: Delphi only?
Dann doch lieber nen packed record :)
|
Re: Record: Delphi only?
packed record?
vorteile, nachteile? |
Re: Record: Delphi only?
bei packed record liegen alle teile des records direkt hintereinander im speicher. lässt man das packed weg wird ausgerichtet.
Hat man zum beispiel ein byte im Record wird glaub ich (ich weiß es nicht genau) dahinter 3 Bytes platz gelassen damit es am 32-bit zugriff ausgerichtet ist und das ganze schneller ist. |
Re: Record: Delphi only?
aha k ich glaub ich bleib beim normallen record
|
Re: Record: Delphi only?
Zitat:
|
Re: Record: Delphi only?
und wie schauts mit c++ und vb aus und so? verwenden die auch packed records?
|
Re: Record: Delphi only?
mit VB hab ich keine Ahnung, aber ich vermute mal, daß die da auch PACHED sind ... und beim C++, C# ... halt bei allen C-Varianten (soweit ich das verstanden hab), sind die so.
In Delphi ist hier standardmäßig ein 3-Byte-Zwischenraum, da der Integer an der nächsten 4-Byte-Grenze ausgerichtet wird. Standard: {$A+}, was einem {$A4} entspricht Das soll halt 'ne Optimierung sein, für einen schnelleren Zugriff ... auf einem 32-Bit-System
Delphi-Quellcode:
Du kannst ja da unten bestimmt erkennen, daß dort der Integer nicht an der selben Position liegt und es somit zu netten Problemchen kommen wird.
x = record
B: Byte; // 3 Bytes i: Integer; end; x = packed record B: Byte; i: Integer; end; // 01234567 // B...iiii // normal // Biiii // packed |
Re: Record: Delphi only?
ja aber wenn ich jetzt überrall packed records verwende dann ist das kein problem auch bei anderen programmiersprachen nicht oder?
|
Re: Record: Delphi only?
Na ja, solange bei denen auch alles packed ist. ;)
(aber meistens sollte es keine Probleme geben) Es hat ja auch noch andere Vorteile ... in Delphi ist ein ungepackter Record auch nicht immer gleich. Ungepackt und bei anderen Ausrichtungen stimmt dort ja auch nichts mehr:
Code:
{$A4} B...iiii
{$A8} B.......iiii |
Re: Record: Delphi only?
gut danke
|
Re: Record: Delphi only?
In C++ sind Strukturen keineswegs immer "packed". Standardmäßig richtet VC++ z.B. auf 8 Bytes aus. Ändern kann man das mit der Compilereinstellung "Strukturmitglieder ausrichten" oder dem Pragma-Befehl "pack", also z.B. "#pragma pack(1)".
|
Re: Record: Delphi only?
Moin Zusammen,
also, solange es keinen zwingenden Grund gibt die Daten zu packen, sollten sie ungepackt bleiben. Wird so ein Record allerdings benutzt, um, z.B., Daten aus einer Datei einzulesen, wird man um das Packen wohl nicht herumkommen (obwohl ich auch schon Dateien mit Füllbytes gesehen habe ;-)) |
Re: Record: Delphi only?
@Oxmyx: OK, wuste ich och noch nicht ._.
@Hasilein: Na ja, ich definiere zwar schon 'ne ganze Weile meine Records als Packed, versehe sie aber abundzu auch selber mal mit entsprechenden FüllBytes ... so hab ich wenigstens die Ausrichtung selber im Griff und der Typ ist, egal wie ausgerichtet wird, immer i.O. |
Re: Record: Delphi only?
hmm ich kann ja dazu sagen des man einen packed record braucht aber was ist besser?
Es sollte auch ein ziemlicher anfänger so eine DLL schreiben können ohne des er sich viel mit den Records auskennen sollte. packed oder not packed? |
Re: Record: Delphi only?
Na ja, wenn du nur mit Delphi auf deine Records zugreifst und überall die Standardeinstellungen läßt ( {$A... }, dann kannst du ganz einfach bei ungepackt bleiben.
Ansonsten kannst du alles packen, oder mußt halt aufpassen, daß du mit der selben ausrichtung arbeitest ... es ist also dir überlassen, was du willst/magst ^^ |
Re: Record: Delphi only?
ja aber ich will ja nicht des es nur über Delphi ansteuerbar ist sondern auch bei "allen" anderen Programmiersprachen.
Gibt es in den sprachen c++, vb, c#, ... überrall packed und not packed? |
Re: Record: Delphi only?
in C++ gibt es das auf jeden fall (wurde ja bereits geschrieben das es da mit "pragma" geht). Ansonsten sollte es in allen Programmiersprachen "packed" geben.
Und wenn du ohne "packed" arbeitest sollte das auch für Programmiersprachen kein Problem sein die es nicht beherrschen weil man dann dort einfach den Record anders definiert. Sieht der Record bei dir also so aus
Delphi-Quellcode:
könnte man das sinngemäß in anderen Programmiersprachen die so definieren
TMyRecord = record
part1: Byte;//danach werden z.B. 3 Bytes aufgefülllt part2: Integer; end;
Delphi-Quellcode:
wenn du also nicht "packed" verwendest sollte es nirgends zu problemen kommen, es muss nur anders definiert werden.
TMyRecord = packed record
part1: Byte; partx: Array[0..2] of Byte; part2: Integer; end; |
Re: Record: Delphi only?
Also packed ist es auf jeden Fall überall
und selbst wenn es not packed nicht geben sollte, so könnte man die nötigen FüllBytes auch selber einfügen. Wie gesagt, inzwischen mach ich es nur noch mit packed, dann ist zwar im QuellCode mehr drin, aber es funktioniert immer und überall :angel:
Delphi-Quellcode:
x = packed Record
B: Byte; _fill: Triple; i: Integer; End; Triple is'n eigener 3-Byte-Type. Es sieht halt besser aus, als
Delphi-Quellcode:
x = packed Record
B: Byte; _fill: packed Array[0..2] of Byte; i: Integer; End; // oder x = packed Record B: Byte; _fill1: Byte; _fill2: Word; i: Integer; End; |
Re: Record: Delphi only?
ok danke leute für die Infos :thumb:
Ich glaub ich werd packed records verwenden |
Re: Record: Delphi only?
Hi Leute
Ich bins mal wieder. Hab noch ne Frage. Wegen den eigenheiten von Delphi. Das eine String variable delphi eigen ist klar aber was gibt es sonst noch was andere Programmiersprachen anderes im Speicher verwalten. Also kann ich z.b. Boolean, Cardinal, ... ohne weiteres verwenden oder bei was muss ich aufpassen. |
Re: Record: Delphi only?
Zu dem Packed:
Weniger wichtig als die tatsächliche Ausrichtung der Daten ist die Tatsache, dass die Ausrichtung bekannt ist. WEnn du z.B. weißt, dass dein Compiler immer an 64-bit-Grenzen ausrichtet, kannst du das eventuellen Benutzern deines Codes sagen und sie können die Daten danach ausrichten. In C# ist es beispielsweise im Normalfall überhaupt nicht festgelegt, wie die Daten genau ausgerichtet werden, aber man kann entweder das Packing oder das exakte Layout der Elemente spezifizieren. Zitat:
In C gibt es beispielsweise keinen bool-Typ. Und ob ein bool-Typ in C++ oder C# identisch ist oder mit dem Delphi-Typ identisch, sei dahingestellt. Bei Typen wie Cardinal solltest du dich vielleicht an den Win32-Typen orientieren, da ein typischer C- oder C++-Programmierer Cardinal überhaupt nicht kennt (würde auf Anhieb auf DWORD tippen?). Generell müssten die meisten Sprachen, die unter Windows verwendet werden, auch die Standard-Windows-API-Typen implementieren. Da gibt es auch einen BOOL-Typ, der wird glaub ich nach int übersetzt. Und irgendwie sagt mir dazu der Name LongBool etwas, das war vielleicht die Delphi-Entsprechung :) |
Re: Record: Delphi only?
Moin Oregon Ghost,
Zitat:
|
Re: Record: Delphi only?
aha ok
dann werd ich einfach statt einem boolean einen integer verwenden (wenn 0 = false, 1 = true :mrgreen: ) naja dann verwende ich nur PChar und integer ... mehr braucht man eigentlich eh nicht |
Re: Record: Delphi only?
Zitat:
Naja, aber im Prinzip ging's darum ja auch :) Wie gesagt, gsh, es gibt für die Windows-API die Typdefinition BOOL, die in Delphi mit LongBool übersetzt werden kann (und damit natürlich auch nicht mehr als ein int bzw. Long ist). Zitat:
|
Re: Record: Delphi only?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 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