AGB  ·  Datenschutz  ·  Impressum  







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

TArray<string> als const im Record deklarieren

Ein Thema von DieDolly · begonnen am 5. Dez 2019 · letzter Beitrag vom 15. Dez 2019
Antwort Antwort
Dennis07

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

AW: TArray<string> als const im Record deklarieren

  Alt 6. Dez 2019, 11:11
Zitat:
Aus kompatibilitätsgründen
Im Prinzip werden Delphi 10.3-Kunden damit bestraft. Mich interessiert kein älteres Delphi.
Der 10.3 Compiler sollte auch auf 10.3 ausgelegt sein. Abwärtskompatibilität, weg damit. Wer einen älteren Compiler will, soll ein älteres Delphi installieren.
Also das ist direkt mehrfach falsch.

Also, erstens, habe ich doch nirgendwo etwas von "Abwärtskompatibilität" gesagt. Weil es nämlich auch nicht stimmt. Statische Arrays funktionieren in Delphi 10.3.3 noch genau wie unter Delphi 1 (zumindest meines Wissens nach).
Was ich meinte, als ich von Kompatibilität sprach, war eher (und ich dachte eigentlich, dass sich das aus dem gesetzten Kontext ergibt) die Kompatibilität zu allen möglichen Schlüsseltypen/-bereichen.

Integer bzw. LongInt bzw. Int32 ist definiert als ein ganzzahliger, zählbarer Typ mit dem Wertebereich von Succ(MaxInt) .. MaxInt . Er wird als Schlüsseltyp für alle dynamischen Arrays, aber auch für die meisten statischen Arrays benutzt. Woher soll der Compiler jetzt aber wissen, welche Schlüssel du für ein statisches Array benutzen möchtest, dessen Elementezahl sich von der Gesamtzahl aller Schlüssel des Wertebereichs unterscheidet?

Das ist schlichtweg nicht möglich. Deshalb musst du immer einen gesamten Wertebereich als Schlüssel angeben, inklusive Ober-und Untergrenze. Das macht den Schlüssel des Arrays kompatibel mit dem entsprechenden Bereichstypen, den es verwendet (beispielsweise ist der Schlüssel eines Arrays mit der Deklaration array [0..5] of T ein anonymer Inline-Typ, der einen Teilbereich des numerischen Standardtyps Integer abbildet und somit zu allen ganzzahligen Typen kompatibel ist, sofern diese mit Integer kompatibel sind).

Definiert die Untergrenze des Schlüssel-Wertebereichs deshalb ein Offset für die Speicherung der Werte in einem Array?
Nein, der Compiler sorgt dafür, dass die entsprechenden Indizes so umgerechnet werden, dass sie für den Programmierer so dargestellt werden. Tatsächlich aber hat ein statisches Array, dessen Schlüsselbereich bei 256 anfängt, nicht ein 255 lehre Speicherblöcke vorweg.

Was ist der Vorteil?
Vorteile gibt es verschiedene. Es ist zum einen eine Bequemlichkeitsfrage: Ich kann einen Aufzählungstypen als Schlüssel verwenden, ohne mich um dessen Wertebereich kümmern zu müssen. Ich muss nicht einmal einen neuen Unterbereich definieren, sondern kann den Bezeichner des Bereichstypen (zB. ein Enum) direkt als Schlüsseltypen verwenden. Der Compiler kennt dadurch die Ober-und Untergrenze des Arrays und weiß, wie viele Werte es gibt und wo er sie hinpacken muss.

Dann wäre da noch ein praktischer Vorteil: Die Kompatibilität zu aufzählungstypen: Man kann ein array[0..n-1] of Char beispielsweise von und/oder zu einem langen String (AnsiString , String bzw. WideString oder UnicodeString ) oder einem PChar, oder aber einem dynamischen array of Char explizit zuweisen (bei String-Literalen genügt sogar eine implizite Zuweisung, da diese automatisch Zieltypisiert werden können).
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TArray<string> als const im Record deklarieren

  Alt 8. Dez 2019, 18:17
Zitat:
Was ist der Vorteil?
Nein, du musst immer die untere und obere Grenze angeben.
Auch bei array[TIrgendeinEnum] of ... ist der untere Bereich gegeben, denn der Enum ist nunmal so definiert, dass er bei 0 beginnt.

Aber jupp, bei einem Offset der unteren Grenze, da rechnet der Compiler überall beim Speicherzugriff dieses Offset automatisch ein und lässt so den genutzten Speicher bei "0" beginnen.



Zitat:
Wenn Delphi nicht so außergewöhnlich abwärtskompatibel wäre
Leider kann man das inzwschen vergessen.

Hach, erinnert sich noch jemand, wie die Firma beim Turbo-Delphi noch so stolz zeigte wie cool abwärtskompatibel doch alles sei?

Seit Delphi 2009 geht es stark bergab.
Spätestens mit Einführung von NextGen ist Delphi nichtmal mehr in der selbenn Version kompatibel.
denn vor allem AutoRefCount macht es nahezu unmöglich einen kompatiblen Code zu schreiben, der überall läuft.


Ab Januar läuft auch für mich der Support von allem vor Windows 10 aus (Win7 ist tot, Win8 nutzt keiner freiwillig, aber seit Win8 gibt es zuviele nette neue APIs)
und auch der Support für alte Delphis gab ich schweren Herzens explizit auf. (XE* und alles davor wird nur noch implizit unterstützt ... entweder es läuft, oder pech gehabt)
Die neuen wieder "kostenfreien" Delphis haben mir da die Entscheidung abgenommen, da auch ohne Geld Aktuelleres möglich ist.

Bei 64 Bit, da liegt es nicht an Delphi ... hier hatte Intel den Vogel abgeschossen, dass der Gedanke Integer und Pointer passen sich an, nun nicht mehr stimmt und somit so einige Codes mühevoll angepasst werden mussten.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Dennis07

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

AW: TArray<string> als const im Record deklarieren

  Alt 8. Dez 2019, 19:51
Zitat:
Was ist der Vorteil?
Nein, du musst immer die untere und obere Grenze angeben.
Auch bei array[TIrgendeinEnum] of ... ist der untere Bereich gegeben, denn der Enum ist nunmal so definiert, dass er bei 0 beginnt.
Wieso denn Nein, wenn du danach überhaupt nicht widersprichst?
Ein Enum ist, genau wie ein ganzzahliger Typ, ein Wertebereich. Und den kannst du entweder vollständig, oder aber teilweise als Schlüssel für ein statisches Array benutzen. Nichts anderes hatte ich versucht zu erklären. Wenn es missverständlich war, bitte ich dies zu entschuldigen.
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TArray<string> als const im Record deklarieren

  Alt 8. Dez 2019, 22:08
Entweder du gibst beide Grenzen rein (array[b..e] of xyz ),
oder einen Typen, der in sich beide Grenzen enthält (array[EnumOrOtherOrdinalType] of xyz ),
also im Endefekt gibst du somit immer beide Grenzen rein.

Sowas wie im C++ und anderen Sprachen geht im Delphi nicht, also nur die Anzahl und implizit beginnt es bei 0: array[13] of xyz für array[0..Anzahl-1] of xyz
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

AW: TArray<string> als const im Record deklarieren

  Alt 9. Dez 2019, 09:17
Zitat:
Sowas wie im C++ und anderen Sprachen geht im Delphi nicht, also nur die Anzahl und implizit beginnt es bei 0: array[13] of xyz für array[0..Anzahl-1] of xyz
Wäre eventuell nicht verkehrt, denn dann gäbe es weniger Leute (in Schulen), die ihre Zählung bei 1 statt 0 anfangen.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.491 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TArray<string> als const im Record deklarieren

  Alt 9. Dez 2019, 12:15
Und was so daran besser sein? Wenn ich Dinge zähle fange ich immer bei 1 an.
Habe gerade bei uns nach "[1.." gesucht - sechs Treffer. Es sind alles "[1..3]". Keinen finde ich verkehrt.
Aber wir schweifen ab.
  Mit Zitat antworten Zitat
Dennis07

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

AW: TArray<string> als const im Record deklarieren

  Alt 9. Dez 2019, 17:55
Zitat:
Sowas wie im C++ und anderen Sprachen geht im Delphi nicht, also nur die Anzahl und implizit beginnt es bei 0: array[13] of xyz für array[0..Anzahl-1] of xyz
Wäre eventuell nicht verkehrt, denn dann gäbe es weniger Leute (in Schulen), die ihre Zählung bei 1 statt 0 anfangen.
Jo, wäre vielleicht in vielerlei hinsicht nicht so dumm. Aber da jetzt noch ein 0.. an den Anfang zu schreiben ist denke ich eine zumutbare Anforderung an den Programmierer. Aber du hast natürlich Recht, semantischer Zucker wäre so etwas. Es würde einige Deklarationen um einiges verkürzen.
Damit der Compiler aber immer noch weiß, dass das nicht der gesamte Wertebereich sondern nur die obere Grenze ist, sollte die Deklaration vielleicht nicht genau so aussehen.

Aber mal ehrlich: Kommen wird das sicher ohnehin nicht, also warum da jetzt Gedanken hin verschwenden. Es gibt statische Arrays, die alles unterstützen, was man sich wünschen könnte und was der Compiler gleichzeitig noch hergibt. Und es gibt dynamische Arrays, die immer bei 0 beginnen und alles andere unterstützen, was statische nicht können.
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TArray<string> als const im Record deklarieren

  Alt 9. Dez 2019, 18:27
Nein, wird nicht kommen, denn der Wunsch wurde schon zu oft in den letzten Jahren gestellt, aber passiert ist nie was.

Das poplige FreePascal (Lazarus) kann sowas seit ewig, da kann Delphi das doch nicht nachmachen.
Ein Therapeut entspricht 1024 Gigapeut.
  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 12:42 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