Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Record: Delphi only? (https://www.delphipraxis.net/71935-record-delphi-only.html)

gsh 22. Jun 2006 16:48


Record: Delphi only?
 
Hi DPler

Hab mal eine Frage ist ein record also sowas:
Delphi-Quellcode:
type
  TIrgendwas = record
    EinString : String;
    EinInteger : Integer;
  end;
Ist das was Delphi eigenes oder gibts sowas in z.b. c, c++, vb, ... auch das komplett gleich aufgebaut ist?
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?

SirThornberry 22. Jun 2006 16:52

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.

gsh 22. Jun 2006 17:01

Re: Record: Delphi only?
 
Zitat:

Zitat von SirThornberry
Dein Record ist Delphieigen weil ein String enthalten ist.

Aso nein des war nur ein beispiel ich werd wegen den DLLs sowieso nur PChar verwenden (oder ist des auch was delpi eigenes?)

Zitat:

Zitat von SirThornberry
Wenn du Pointer im Record hast liegt das wo der pointer hinzeigt natürlich nicht mit dabei.

ja klar aber das ist ja egal wenn der pointer im record dann auf die richte stelle zeigt :wink:

Der_Unwissende 22. Jun 2006 17:05

Re: Record: Delphi only?
 
Zitat:

Zitat von gsh
Aso nein des war nur ein beispiel ich werd wegen den DLLs sowieso nur PChar verwenden (oder ist des auch was delpi eigenes?)

PChar ist natürlich nichts Delphi-Eigenes (wird auch in der Win-API verwendet). Ist einfach nur ein Zeiger auf einen Speicher bereich, in dem ein Bytearray liegt. Dieses wird als "Nullterminierter String" interpretiert (endet also wirklich auf 0x00).

Gruß Der Unwissende

gsh 22. Jun 2006 17:08

Re: Record: Delphi only?
 
Also wenn ich des so scheib:
Delphi-Quellcode:
type
  TIrgendwas = record
    EinPChar : PChar;
    EinInteger : Integer;
  end;
dann geht des überall oder?

SirThornberry 22. Jun 2006 17:11

Re: Record: Delphi only?
 
genau der Record ist perfekt und dürfte keine Probleme bei DLL-Arbeiten bereiten.

gsh 22. Jun 2006 17:19

Re: Record: Delphi only?
 
ok danke :thumb:

werd des jetzt versuchen und wenn ich probleme hab meld ich mich wieder :zwinker:

Hawkeye219 22. Jun 2006 17:19

Re: Record: Delphi only?
 
Zitat:

Zitat von SirThornberry
genau der Record ist perfekt und dürfte keine Probleme bei DLL-Arbeiten bereiten.

...sofern alle Beteiligten mit der gleichen Ausrichtung innerhalb des Records arbeiten: [oh]$ALIGN[/oh]

Gruß Hawkeye

SirThornberry 22. Jun 2006 17:26

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.

brechi 22. Jun 2006 17:34

Re: Record: Delphi only?
 
Dann doch lieber nen packed record :)

gsh 22. Jun 2006 17:35

Re: Record: Delphi only?
 
packed record?

vorteile, nachteile?

SirThornberry 22. Jun 2006 17:37

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.

gsh 22. Jun 2006 18:20

Re: Record: Delphi only?
 
aha k ich glaub ich bleib beim normallen record

himitsu 22. Jun 2006 19:00

Re: Record: Delphi only?
 
Zitat:

Zitat von gsh
aha k ich glaub ich bleib beim normallen record

nimm packed records ... in C sind eh alle Records packed, dann hast du also weniger Probleme :zwinker:

gsh 22. Jun 2006 19:04

Re: Record: Delphi only?
 
und wie schauts mit c++ und vb aus und so? verwenden die auch packed records?

himitsu 23. Jun 2006 10:33

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:
x = record
  B: Byte;
  // 3 Bytes
  i: Integer;
end;

x = packed record
  B: Byte;
  i: Integer;
end;

// 01234567
// B...iiii // normal
// Biiii    // packed
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.

gsh 23. Jun 2006 10:37

Re: Record: Delphi only?
 
ja aber wenn ich jetzt überrall packed records verwende dann ist das kein problem auch bei anderen programmiersprachen nicht oder?

himitsu 23. Jun 2006 10:51

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

gsh 23. Jun 2006 10:57

Re: Record: Delphi only?
 
gut danke

Oxmyx 23. Jun 2006 11:34

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)".

Christian Seehase 23. Jun 2006 11:47

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 ;-))

himitsu 23. Jun 2006 11:53

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.

gsh 23. Jun 2006 12:09

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?

himitsu 23. Jun 2006 12:14

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 ^^

gsh 23. Jun 2006 12:17

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?

SirThornberry 23. Jun 2006 12:23

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:
TMyRecord = record
  part1: Byte;//danach werden z.B. 3 Bytes aufgefülllt
  part2: Integer;
end;
könnte man das sinngemäß in anderen Programmiersprachen die so definieren
Delphi-Quellcode:
TMyRecord = packed record
  part1: Byte;
  partx: Array[0..2] of Byte;
  part2: Integer;
end;
wenn du also nicht "packed" verwendest sollte es nirgends zu problemen kommen, es muss nur anders definiert werden.

himitsu 23. Jun 2006 12:25

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;

gsh 23. Jun 2006 12:44

Re: Record: Delphi only?
 
ok danke leute für die Infos :thumb:

Ich glaub ich werd packed records verwenden

gsh 6. Jul 2006 18:23

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.

OregonGhost 6. Jul 2006 20:00

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:

Also kann ich z.b. Boolean, Cardinal, ... ohne weiteres verwenden oder bei was muss ich aufpassen.
Jein.
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 :)

Christian Seehase 6. Jul 2006 20:42

Re: Record: Delphi only?
 
Moin Oregon Ghost,

Zitat:

Zitat von Oregon Ghost
da ein typischer C- oder C++-Programmierer Cardinal überhaupt nicht kennt (würde auf Anhieb auf DWORD tippen?)

richtig getippt, zumindest solange Du es auf Windows einschränkst, denn "normaler" Typ für C/C++ ist DWORD ja nun auch nicht, da es ja erst in der WinDef.h deklariert wird (unsigned long) ;-)

gsh 7. Jul 2006 07:50

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

OregonGhost 7. Jul 2006 08:51

Re: Record: Delphi only?
 
Zitat:

richtig getippt, zumindest solange Du es auf Windows einschränkst, denn "normaler" Typ für C/C++ ist DWORD ja nun auch nicht, da es ja erst in der WinDef.h deklariert wird (unsigned long)
Merkt man, dass ich fast ausschließlich unter Windows programmiere? :mrgreen:
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:

dann werd ich einfach statt einem boolean einen integer verwenden (wenn 0 = false, 1 = true Mr. Green )
In Visual Basic ist -1 der Wert für true... also lieber wenn 0 dann false, wenn <>0 dann true.

gsh 7. Jul 2006 09:28

Re: Record: Delphi only?
 
Zitat:

Zitat von OregonGhost
Zitat:

dann werd ich einfach statt einem boolean einen integer verwenden (wenn 0 = false, 1 = true Mr. Green )
In Visual Basic ist -1 der Wert für true... also lieber wenn 0 dann false, wenn <>0 dann true.

ok werd ich machen. danke für den tipp


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 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