AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"Datentyp" record end wer kennt ihn?

Ein Thema von QuickAndDirty · begonnen am 4. Dez 2024 · letzter Beitrag vom 11. Dez 2024
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.999 Beiträge
 
Delphi 12 Athens
 
#1

AW: "Datentyp" record end wer kennt ihn?

  Alt 4. Dez 2024, 12:42
Das kenne ich schon ziemlich lange z.B. aus VirtualTreeView und es ist auch heute noch so drin:
Delphi-Quellcode:
  TVirtualNode = packed record
...
  private
    Data: record end; // this is a placeholder, each node gets extra data determined by NodeDataSize
  public
OMG Das ist ein ziemlich cleverer Nutzen, wenn man Komponentenanbieter ist.

Ich nehme an das ganze funtkioniert nicht mit Managed Records oder?


Nun ja... Diese Syntax ist in Standard Pascal schon immer möglich gewesen. Es ist halt ein record und der Inhalt ist leer.
https://www.cs.kent.edu/~durand/CS43...ml#record-type
Ich wusste davon halt lange nichts.
Ich meine mir war klar das es irgendwie alt ist, aber habe das vorher nie gesehen .
Und ich habe in der Schule noch Pascal im Informatik Untericht gelernt!!! Also ich bin alt.


Jupp, das ist ein NULL Byte große Typ.
In C++ wird stattdessen gern ein VOID oder ein array[0] verwendet, was aber im Delphi nicht geht, da dort das Kleinste ein array[0..0] ist, welches 1 statt 0 Items enthält.
Beachte: VOID, nicht VOID*, weil das wäre ein "Pointer".
Interessant. aber sowas als parameter gibt es nicht oder ? So eine are "gib irgend einen Record rein" parameter?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#2

AW: "Datentyp" record end wer kennt ihn?

  Alt 4. Dez 2024, 12:49
Und ich habe in der Schule noch Pascal im Informatik Untericht gelernt!!! Also ich bin alt.
Zu meiner Schulzeit gab es noch nicht mal ein Fach Informatik...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#3

AW: "Datentyp" record end wer kennt ihn?

  Alt 4. Dez 2024, 12:53
Zitat:
Ich nehme an das ganze funtkioniert nicht mit Managed Records oder?
warum nicht?

Also dieser "leer record" selbst hat nichts mit Managed zu tun, bzw. auch einen Managed Record kannst du ohne "Fields" deklarieren.

Und was den VST betrifft, wenn/da er auch normale Managed Types (String, DynArray, Variant oder Interface) beherschen sollte, wäre da prinzipiell auch ein Managed Record mit abgedeckt.


Delphi-Quellcode:
prodedure Test(var Irgendwas);

prodedure Test(const Irgendwas);
Aber drin mußt du dann selbst casten, da es innen nur die Referenz gibt, aber leider keine TypeInfo.

Da muß man dann schon auf Generics übergehn, so ala prodedure Test<T>(Irgendwas: T); .
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Dez 2024 um 12:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#4

AW: "Datentyp" record end wer kennt ihn?

  Alt 4. Dez 2024, 12:57
Delphi-Quellcode:
var
  Data1: record end;

  Data2: record
    i: Integer;
  end;
Delphi-Quellcode:
type
  TRecordA = record
    i: Integer;
  end;

  TRecordB = record
    x: Integer;
    y: TRecordA;
  end;


  TRecordC = record
    x: Integer;
    y: record;
      i: Integer;
    end;
  end;
Das ist ein Nested-Type, also ein Typ, der inline (nicht explizit) deklariert wird,
aber teilweise fehlen ihm einige TypeInfos, womit generische Zugriffe darauf schwer bis garnicht möglich sind.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Dez 2024 um 13:00 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.999 Beiträge
 
Delphi 12 Athens
 
#5

AW: "Datentyp" record end wer kennt ihn?

  Alt 4. Dez 2024, 13:45
Ich nehme an "Record end;" funktioniert nur in Records?
Weil in FMX haben wir ja sehr nützliche
Delphi-Quellcode:
TagObject:TObject;
TagString:String;
Tag:NativeInt;
Aber sowas wie
TagRecord:Record end; Ginge vermutlich nicht?
So ein Typ für irgendeinen gemanagden Record.

Edit:
!!!heilige Scheiße!!!
Ich habe jetzt erst verstanden dass "record end;" kein einfacher Typ ist sondern ein leerer inline deklarierter Record...
Sorry , dass ich mich so dumm angestellt habe...danke das ihr am Ball geblieben seid und mir das weiter erklärt habt.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 4. Dez 2024 um 13:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#6

AW: "Datentyp" record end wer kennt ihn?

  Alt 4. Dez 2024, 14:24
Jupp, im Prinzip ist das
Delphi-Quellcode:
var
  TagRecord: record end;
sowas
Delphi-Quellcode:
type
  VOID = record end;
var
  TagRecord: VOID;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#7

AW: "Datentyp" record end wer kennt ihn?

  Alt 4. Dez 2024, 14:47
ein leerer inline deklarierter Record...
Eigentlich ist das nur ein Trick um einen Feldnamen für die Daten zu bekommen, die an der Stelle noch unbekannt sind.
Delphi-Quellcode:
function TVirtualNode.GetData(): Pointer;

// Returns the associated data converted to the class given in the generic part of the function.

begin
  Result := @Self.Data;
  Include(States, vsOnFreeNodeCallRequired);
end;
Oder wer's lieber generisch mag (bin gar nicht sicher, ob das wirklich nur für Klassen gilt ):
Delphi-Quellcode:
function TVirtualNode.GetData<T>: T;

// Returns the associated data converted to the class given in the generic part of the function.

begin
  Result := T(Pointer((PByte(@(Self.Data))))^);
  Include(States, vsOnFreeNodeCallRequired);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#8

AW: "Datentyp" record end wer kennt ihn?

  Alt 4. Dez 2024, 16:09
Es gibt in einigen API/Records oftmals Daten hinter dem Record, z.B. im Record nur NameLen und dann "eigentlich" hinter dem Record stehen die Chars des Namen.

Um im Speicher einen Zeiger auf den Namen zu haben, verwenden Viele gern sowas, aber auch char[0] name , was sich so aber nicht nach Delphi konvertieren lässt, da char[0] "keine Chars" bedeutet, aber ein name: array[0..0] of AnsiChar halt "1 Char" ergibt, womit der Record in Delphi eine falsche Größe besitzt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
491 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: "Datentyp" record end wer kennt ihn?

  Alt 11. Dez 2024, 13:55
Ich nutze das manchmal als leeren Typen für Typparameter generischer Typen, wenn der Typparameter egal ist. Angenommen du hast so einen Typen:
Delphi-Quellcode:
TMyGen<T> = class
  const Value = 5.56;
end;
Und du deklarierst einen leeren Typen TNil irgendwo:
Delphi-Quellcode:
TNil = record
end;
Und du willst jetzt nicht unbedingt irgendeinen spezifischen Typparameter für TMyGen<T> festlegen, dann kannst du mit einem "leeren" typen so auf Value zugleifen:
TMyGen<TNil>.Value Ich finde, so einen void-typen mit der Größe 0 (SizeOf(TNil) ergibt ja 0 ) sollte es standardmäßig in SysUtils oder so geben.
Dennis
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:09 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