otherwise anstelle else bei case

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

otherwise anstelle else bei case

Beitrag von Mathias »

Ich habe gerade ein neues reserviertes Wort entdeckt "otherwise":

Code: Alles auswählen

var
  i: integer;
begin
  i := 2;
  case i of
    0: begin
      ShowMessage('0');
    end;
    1: begin
      ShowMessage('1');
    end;
    otherwise // sonst else
    begin
      ShowMessage('>=2');
    end;
  end;  
Weis einer für was otherwise gut ist ?
Oder was ist der Unterschied zu else ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: otherwise anstelle else bei case

Beitrag von fliegermichl »

Die Dokumentation sagt, daß man statt else auch otherwise schreiben kann. Es macht keinen Unterschied.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: otherwise anstelle else bei case

Beitrag von Winni »

Hi!

Otherwise ist original Pascal von N. Wirth.

Das else im case wurde von Turbo-Pascal eingeführt.

Eine der vielen Verhunzungen, die wir TP verdanken.

Inklusive der Mini-Sets, die nur 256 Elemente enthalten können.
UCSD-Pascal konnte 1979 (!!) schon 4096 Members in einem Set enthalten.

Und die Verkettung von strings per "+" ist ja wohl übelstes Basic.
Auch so eine TP-Erfindung.

Winni

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: otherwise anstelle else bei case

Beitrag von Mathias »

Und die Verkettung von strings per "+" ist ja wohl übelstes Basic.
Auch so eine TP-Erfindung.[quotel]
Was findest du daran so schlimm ?

Code: Alles auswählen

s := s + 'abc';
Oder wie willst du dies besser lösen ?
Das else im case wurde von Turbo-Pascal eingeführt.
Das ist eine Erklärung, aber schlecht finde ich das von TP nicht. "else" ist doch alternativ, so wie bei "if".
Inklusive der Mini-Sets, die nur 256 Elemente enthalten können.
UCSD-Pascal konnte 1979 (!!) schon 4096 Members in einem Set enthalten.
Dies könnte das FPC-Team sicher auch einbauen. Oder ist dies dann nicht mehr Delphi komform ?

Aber im Allgemeinen ist dies alles noch viel besser als C/C++.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: otherwise anstelle else bei case

Beitrag von Winni »

Hi!

Zur Stringverkettung:

Seit den frühsten Pascal-Tagen gibt die function concat:

Code: Alles auswählen

ResultString := concat (str1,str2, [str3...strn] );
Zum else in case:

Wenn man das case in der Tiefe von vielen ifs hat, so ist es angenehm wenn man auf ein otherwise stößt - man weiß, wo man ist, zwischen vielen if then else.

Zu den Mini-Sets:

Seit dem Begin von Turbo-Pascal (1983) hühnern wir mit der 256-Elemente-Grenze rum, was auch im internatonalen Forum immer wieder bitterlich beklagt wird, Irgendwo haben die fpc-Macher große Sets versprochen, aber keinen Zeitpunkt erwähnt. Wird aber auch Zeit nach knapp 40 Jahren, wo wir 1979 schon mal deutlich weiter waren - siehe meine erste Mail.

Winni

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: otherwise anstelle else bei case

Beitrag von Winni »

Mathias hat geschrieben:
Mi 5. Okt 2022, 15:54
Aber im Allgemeinen ist dies alles noch viel besser als C/C++.
Jo - aber das ist doch selbstverständlich ....

Und dafür der Merksatz:

In geschweiften Klammern stehen die Kommentare.
In allen Programmier-Sprachen.

Winni

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: otherwise anstelle else bei case

Beitrag von m.fuchs »

Winni hat geschrieben:
Mi 5. Okt 2022, 18:16
Seit den frühsten Pascal-Tagen gibt die function concat:

Code: Alles auswählen

ResultString := concat (str1,str2, [str3...strn] );
Das macht ja nichts. Inc gibt es auch schon eine Weile, trotzdem kann man auch mit + Zahlen addieren. Ich finde das nicht schlimm, dass der Operator für Stringverkettung der gleiche ist wie der für mathematische Addition. Bei einer typisierten Sprache sehe ich da keine Nachteile.
Winni hat geschrieben:
Mi 5. Okt 2022, 18:16
Zum else in case:

Wenn man das case in der Tiefe von vielen ifs hat, so ist es angenehm wenn man auf ein otherwise stößt - man weiß, wo man ist, zwischen vielen if then else.
Wenn man ein case verschachtelt zwischen vielen ifs hat, dann hat man ein ganz anderes Problem. Nämlich schlechten Code. Da hilft dann das otherwise auch nicht mehr so richtig.
Auch hier wieder die Frage: was ist so schlimm, wenn das gleiche Keyword in einem unterschiedlichen Kontext eine ähnliche Funktion hat? Ist im Gegenteil eher einfach zu merken.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: otherwise anstelle else bei case

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mi 5. Okt 2022, 15:01
Weis einer für was otherwise gut ist ?
Oder was ist der Unterschied zu else ?
otherwise stammt ursprünglich aus ISO Extended Pascal und erfüllt genau die gleiche Funktion in einer case-Anweisung wie das Turbo Pascal else.
Winni hat geschrieben:
Mi 5. Okt 2022, 15:25
Otherwise ist original Pascal von N. Wirth.
Nein, das originale Pascal enthält keinen Alternativzweig für die case-Anweisung (siehe Niklaus Wirth - The Programming Language Pascal, Punkt 9.2.2.2). ISO Pascal enthält das auch noch nicht. Das wurde erst mit ISO Extended Pascal in der Form von otherwise eingeführt.
Winni hat geschrieben:
Mi 5. Okt 2022, 15:25
Inklusive der Mini-Sets, die nur 256 Elemente enthalten können.
UCSD-Pascal konnte 1979 (!!) schon 4096 Members in einem Set enthalten.
Das hat aber auch immer mit der Größe zu tun: ein Set mit 256 Elementen ist immer 32 Byte groß. Bei einem Set mit 4096 Elementen ist das entsprechend 512 Byte. Da Sets solcher Größe auf dem Stack übergeben werden ist das durchaus eine Hausnummer, die man bedenken muss.
FPC Compiler Entwickler

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: otherwise anstelle else bei case

Beitrag von Winni »

PascalDragon hat geschrieben:
Do 6. Okt 2022, 09:25

Das hat aber auch immer mit der Größe zu tun: ein Set mit 256 Elementen ist immer 32 Byte groß. Bei einem Set mit 4096 Elementen ist das entsprechend 512 Byte. Da Sets solcher Größe auf dem Stack übergeben werden ist das durchaus eine Hausnummer, die man bedenken muss.
Hi!

Die frühen Versionen von UCSD-Pascal benötigten 64 kB RAM, die späteren 128 kB. Da wird in Zeiten von Maschinen mit RAM >= 16 Gigabyte ja noch etwas Platz auf dem Stack sein.

Winni

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: otherwise anstelle else bei case

Beitrag von af0815 »

Vergiss nicht, das der fpc verdammt viele Plattformen kann und die müssen nicht unbedingt mit Speicher gesegnet sein.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: otherwise anstelle else bei case

Beitrag von Socke »

af0815 hat geschrieben:
Do 6. Okt 2022, 13:21
Vergiss nicht, das der fpc verdammt viele Plattformen kann und die müssen nicht unbedingt mit Speicher gesegnet sein.
Ich hab noch einen STM32 zuhause rumfliegen. Da passen gerade mal 40 Sets mit 4096 Elementen in den Speicher. Den Stack muss man dann aber in den Flash auslagern :lol:.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: otherwise anstelle else bei case

Beitrag von Winni »

Hi!

Also 512 Byte sind nur genau 2 mal string[255].

Nun mal nicht so tun, als ob wir gerade Ende der 70er sind und 64 kB RAM zur Verfügung haben.

Und da ging's ja auch, wie UCSD-Pascal gezeigt hat
.

Außerdem könnte man das ganze ja optimieren.
Wird ja heute schon gemacht.
Wenn weniger als 32 Elemente im Set vorhanden sind, wird das in ein DWord gepackt. Glaub ich.

Winni

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: otherwise anstelle else bei case

Beitrag von PascalDragon »

Winni hat geschrieben:
Do 6. Okt 2022, 14:06
Außerdem könnte man das ganze ja optimieren.
Wird ja heute schon gemacht.
Wenn weniger als 32 Elemente im Set vorhanden sind, wird das in ein DWord gepackt. Glaub ich.
Ja, FPC nimmt immer die Mindestgröße, die benötigt wird (auch bei mehr als 32 Elementen). Aber es ging mir hier darum, wenn Leute die größeren Sets auch wirklich ausnutzen.
FPC Compiler Entwickler

Antworten