Autor Beitrag
hjl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22
Erhaltene Danke: 2

Windows 10 Enterprise (64 Bit)
Delphi 7, Delphi XE2, Delphi Berlin (10.1), Delphi Tokyo (10.2)
BeitragVerfasst: Do 09.11.17 09:46 
Neulich stieß ich auf eine alte Quelltextdatei eines anderen Programmierers, unter anderem mit folgender Deklaration, die ich nicht für möglich gehalten hätte:

True, False : Boolean;


Dies waren global definierte Variablen!
Da sie nirgends gesetzt wurden, hatten wohl beide den Default-Wert false.
Alles, was auf True gesetzt wurde, also auf die Variable True, wurde auf false gesetzt.
Das hatte in einem alten Programmprojekt mit mehreren inkludierten Dateien für Verwirrung mit langer Fehlersuche gesorgt, bis ich diese Deklaration fand.

Was ich mich hier frage ist, wieso lassen alle Delphi-Compiler (7, Berlin, Tokyo) das ohne Warnung und ohne Fehlermeldung durchgehen und verweigern nicht die Compilation?

In einem Java-Forum wurde erklärt, true und false seien keine Schlüsselworte, sondern Literale, man könne sie nicht als Bezeichner verwenden.
Warum aber in Delphi?
doublecross
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 149
Erhaltene Danke: 27

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: Do 09.11.17 12:44 
Hallo,

das ist mal eine der Stellen, wo Delphi dir solchen Blödsinn nicht verbietet. Du kannst auch etwas definieren wie Integer : Integer;. Delphi weiß einfach vor dem Doppelpunkt steht ein Variablenname und hinten den selben ein Typ.

Dass kann sogar sinnvoll sein. Ich habe z. B. mal mit an einem (alten) Projekt gearbeitet, welches viel mit Typisierten (binären) Dateien gearbeitet hat. Mit irgend einem Delphi (oder war es sogar noch Turbo Pascal?) Update wurde dann der Datentyp "Integer" von einem 16 Bit Wert zu einem 32 Bit Wert umdefiniert. Mit der folge, dass sich die alten Dateien nicht mehr öffnen ließen, denn dort waren 16 Bit Werte gespeichert und die Records die gefüllt werden sollten, erwarteten aber plötzlich 32 Bit.

Es war eine heiden Arbeit sämtliche Datenstrukturen zu finden und auf neue Typen anzupassen. Damit die Arbeit nicht irgendwann, wenn vielleicht ein 64 Bit Integer zum Standard wird nicht erneut auftritt, wurde zu diesem Zeitpunkt Verboten die Nativen Datentypen zu nutzen und statt dessen wurden selbsdefinierte verwendet Also Dinge wie:

ausblenden Delphi-Quelltext
1:
2:
3:
  Int8 = System.ShortInt;
  Int16 = System.SmallInt;
  Int32 = System.LongInt;


Alle diese Typen wurden in einer Zentralen Unit definiert, welche überall eingebunden werden musste. Gleichzeitig hatte diese Unit aber auch die Aufgabe zu verhindern, dass noch jemand die alten Datentypen verwendet. Um dies zu gewährleisten definerte sie ein paar dummy Proceduren, wie z. B. Procedure Integer;, was zu einem Kompilierfehler bei jeder Verwendung des Datentypen Integer führte.

In diesem Speziellen Kontext war das Verdecken von Schlüsselworten also hilfreich und erwünscht, weshalb ich es prinzipiell auch nicht schlecht finde, dass Delphi es erlaubt, auch wenn man in den allermeisten Fällen Abstand von solchen Ideen nehmen sollte.
Nur sollte auch jedem Entwickler klar sein, dass es keine gute Idee ist, seine Variablen wie Schlüsselworte zu benennen. Daher hatte der Kollege, der das ganze in deinem Projekt definiert hat entweder einen ziemlich schlechten Tag, oder er hat die Definition tatsächlich in böser Absicht platziert. Ich denke gegen Probleme die aus einer dieser Beiden Situationen entstehen, kann man ich ohnehin nicht schützen.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Do 09.11.17 14:23 
Ganz einfach: "true" und "false" sind keine reservierten Wörter und mithin als Bezeichner erlaubt, jedenfalls bei Pascal & Co.

user profile icondoublecross hat folgendes geschrieben Zum zitierten Posting springen:
Mit irgend einem Delphi (oder war es sogar noch Turbo Pascal?) Update wurde dann der Datentyp "Integer" von einem 16 Bit Wert zu einem 32 Bit Wert umdefiniert.


Das war nicht "irgendein" Delphi, sondern konkret das mit der Versionnummer 2.0, bei dem 32 Bit eingeführt wurden. Bestimmte Datentypen wurden damals bzw. bei diesem Upgrade "aufgebohrt", so string, cardinal und integer (letztere beide auch als generische Integer-Typen bezeichnet). Leider hielt man diese Erweiterbarkeit nicht durch, denn bei Delphi XE2, bekanntermaßen das erste mit 64 Bit, waren cardinal und integer leider nicht 64 Bit.

user profile icondoublecross hat folgendes geschrieben Zum zitierten Posting springen:
Mit der folge, dass sich die alten Dateien nicht mehr öffnen ließen, denn dort waren 16 Bit Werte gespeichert und die Records die gefüllt werden sollten, erwarteten aber plötzlich 32 Bit.


Hm, das wundert mich ein bißchen. Tendenziell hätte ich eine Abwärtskompatibilität der 32-Bit-Typen vermutet.
doublecross
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 149
Erhaltene Danke: 27

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: Do 09.11.17 15:38 
Hi,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Hm, das wundert mich ein bißchen. Tendenziell hätte ich eine Abwärtskompatibilität der 32-Bit-Typen vermutet.


wenn du einen solchen Record hast:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
tData = packed record
  Zahl : integer;
  Key : string[20];
  Summe : Cardinal;
end;


und speicherst den mit Delphi 1 in eine Datei, so steht der erste Buchstabe von Key im dritten Byte. Ließt du diese Datei aber wieder mit Delphi 2 ein, so erwartet dieses, dass Byte 3 und 4 aber noch zu "Zahl" gehören, und wird diese entsprechend interpretieren. Ich wüsste nicht, wie Dephi sich da anders verhalten sollte. Zumal das ganze, wenn du die Datei inkrementell ließt, wahrscheinlich von der Dateilänge her nicht aufgehen wird (abhängig von der Anzahl der Datensätze).

Für diesen Beitrag haben gedankt: Delphi-Laie
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 10.11.17 09:28 
Dieser Umstand ziert schon seit Jahren meinen Avatar. :D
Und das wird nicht geändert, weil sonst mein Avatar nicht mehr lustig wäre. :mrgreen:

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)