[gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Erwin
Beiträge: 286
Registriert: Mi 16. Sep 2009, 14:15
OS, Lazarus, FPC: Xubuntu 22.04 / x86_64_linux-gtk 2 / L 2.2.0 / FPC 3.2.2

[gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von Erwin »

Hallo Zusammen.

Ich habe hier ein Beispielcode, der für meine Frage betreffend stellvertretend einiger meiner Proceduren ist:

Code: Alles auswählen

 
procedure ArrayInhaltAnzeigen(); // meine eigene Procedure, ohne Variablen die an die Procedure übergeben werden.
 
var
  Form1: TForm1;
  ArrayInhalt:Array[1..10] of String=('1','2','3','4','5','6','7','8','9','10');
  ij:Integer;
 
procedure TForm1.ArrayInhaltAnzeigen();
begin
  ArrayButton.Caption:=ArrayInhalt[ij]; // Dies ist ein vereinfachte Dahrstellung. Wenn meine Proceduren nur diesen oder ähnlich kurzen Code enthalten würden, könnte man sich die Proceduren ersparen.
end;
 
procedure TForm1.ArrayButtonClick(Sender: TObject);
begin
  ij:=Random(10);
  ArrayInhaltAnzeigen; // <--- Darum geht es mir. Man kann es ja auch
// "ArrayInhaltAnzeigen();" schreiben, also mit '()'. Gehen tut beides.
end;
 

Ist das nun Geschmackssache? Oder kann sich eine der beiden Schreibweisen sich später rächen? Oder rächt sich das eh bereits vorerst unbemerkbar im Hintergrund?

Danke.
Zuletzt geändert von Erwin am Di 26. Jun 2018, 10:13, insgesamt 2-mal geändert.
Lazarus 2.2.0 / FP 3.2.4

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

Re: Procedute ohne Var dennoch mit oder ohne '()'?

Beitrag von Mathias »

Normalerweise nicht, da wir keine C++ Programmierer sind.

Aber eine Ausnahme gibt, bei rekursiven Funktionen.

Code: Alles auswählen

  function Test: byte;
  var
    b: byte;
  begin
    b := Test;   // b bekommt den Result-Wert.
    b := Test(); // Hier wird Test nochmals aufgerufen.
    Test();      // geht.
    Test;        // Syntax-Fehler;
  end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Procedute ohne Var dennoch mit oder ohne '()'?

Beitrag von kupferstecher »

Ich hatte mal so einen Fall, da gabs - wenn ich mich richtig erinnere - einen Kompilierfehler bei fehlenden Klammern beim Aufruf. Das war aber definitiv keine rekursive Funktion. Kann aber auch ein Bug gewesen sein, der mittlerweile gefixt ist.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Procedute ohne Var dennoch mit oder ohne '()'?

Beitrag von mse »

Erwin hat geschrieben:Ist das nun Geschmackssache?

Code: Alles auswählen

 
Test()
 

ist immer ein Prozedur-Aufruf, darum schreibe ich die Klammern auch immer bei einem Prozedur-Aufruf.
Mit

Code: Alles auswählen

 
Test
 

kann auch der Inhalt einer Procedur-Variable oder mit @ die Addresse der Prozedur gemeint sein, oder, wie Mathias schreibt, ein Funktions-Rückgabewert; es kommt auf den Zusammenhang an.
MSElang schreibt für Aufrufe die "Test()"-Form vor um ein einheitliches Bild zu gewährleisten.

Erwin
Beiträge: 286
Registriert: Mi 16. Sep 2009, 14:15
OS, Lazarus, FPC: Xubuntu 22.04 / x86_64_linux-gtk 2 / L 2.2.0 / FPC 3.2.2

Re: Procedute ohne Var dennoch mit oder ohne '()'?

Beitrag von Erwin »

Auf die Idee, auch bei der Procedure selbst ebenfalls die Klammern wegzulassen, bin ich noch gar nicht gekommen. Geht aber ebenfalls.

Mathias, function funktioniert bei mir auch ohne Klammern. Allerdings nicht genau der Code wie bei Dir, wo Du scheinbar die function selber aufrufen lässt.
Allerdings funktioniert das auslesen eines Array scheinbar nicht? Musste dies durch einfache Variablen ersetzen.

kupferstecher, könnte auch sein, dass dies auch ein Zeichen dafür ist, dass es ohne Klammern doch nicht geschrieben gehört, aber der Compiler, wenn man es ihm 'erklärt', dennoch dann richtig umsetzt/ausführt. Allerdings wenn dem so ist ... naja, Compiler übersetzt ja eh, dürfte dann teils egal sein. Anderseits könnte es bei anderen Sprachen dies dann vielleicht doch zu Problemen führen, weshalb man ich es mir ohne Klammern vielleicht doch nicht angewöhnen sollte?

mse, sprichst wohl die Verwechslungsgefahr damit an? Stimmt schon, mit Klammern ist einem schneller (zusätzlich) klar; dass ist ein Funktions-/Procedure-Aufruf.
Ist vermutlich zumindest kein wirklicher Zeitverlust, noch schnell '()' hinzuzufügen. Weil man überliest doch immer wieder das F an Anfang (in mein Beispiel habe ich auch noch sogar (wieder mal) darauf verzichtet, die Bezeichnung mit F zu beginnen!). Während Klammern doch etwas mehr auffällt, bzw. eine weitere Hilfe zum unterscheiden ist.

Danke Euch allen. Zumindest scheint es doch etwas zu sein, was man klären sollte. Und wenn ich Euch richtig verstanden habe, schreibt ihr alle Drei also die '()' dazu? In beiden Fällen (bei Erstellung und Aufruf).
Lazarus 2.2.0 / FP 3.2.4

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

Re: Procedute ohne Var dennoch mit oder ohne '()'?

Beitrag von Mathias »

Ich schreibe die () normslerweise nicht, ausser wen sie automatisch mit Ctrl+Space kommen.

Dein Problem mit der Array hat nichts mit den () zu tun.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Procedute ohne Var dennoch mit oder ohne '()'?

Beitrag von kupferstecher »

Erwin hat geschrieben:Und wenn ich Euch richtig verstanden habe, schreibt ihr alle Drei also die '()' dazu? In beiden Fällen (bei Erstellung und Aufruf).

Ich bin da selber noch nicht einig mit mir, gerade wegen der einen Fehlermeldung damals. In der Deklaration und in der Funktion selber lass ich die Klammern immer weg, beim Aufruf auch außer bei Funktionszeigern.
Prinzipiell finde ich, dass Klammern den Lesefluss stören. Außerdem sind mir solche Aufrufe() zu c-artig (und dagegen bin ich allergisch)...

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
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: Procedute ohne Var dennoch mit oder ohne '()'?

Beitrag von m.fuchs »

Mathias hat geschrieben:Aber eine Ausnahme gibt, bei rekursiven Funktionen.

Es kommt aber eher selten vor, dass man eine Funktion rekursiv baut ohne dabei einen Parameter zu übergeben.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Erwin
Beiträge: 286
Registriert: Mi 16. Sep 2009, 14:15
OS, Lazarus, FPC: Xubuntu 22.04 / x86_64_linux-gtk 2 / L 2.2.0 / FPC 3.2.2

Re: Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von Erwin »

Ok, herrscht also doch keine all zu große Einigkeit hier über diese Schreibstilfrage?

Mathias, Du lässt also immer die Klammern weg (, natürlich dann wenn kein Wert übergeben wird)?
Und hast wohl bis jetzt keine Probleme damit festgestellt?

kupferstecher, Du würdest oder lässt sie auch weg, aber mit Unbehagen, wegen der Fehlermeldung damals? Diese trat aber danach (mit der nächsten Version?) nicht mehr auf?

Dann ist es also doch vor allem Geschmackssache?
Lazarus 2.2.0 / FP 3.2.4

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von mse »

Nicht unbedingt Geschmackssache sondern Stil/Systematik. Meiner Meinung nach sollten Codeelemente die das gleiche machen auch immer gleich aussehen. Ein Funktions/Prozedur Aufruf hat zwingend Klammern wenn Parameter übergeben werden sollen, darum sollten auch Aufrufe ohne Parameter mit Klammern geschrieben werden um Verwechslungen mit Adressen und Variablen zu vermeiden.
Auch parameterlose Funktions/Prozedur Definitionen schreibe ich zur Vereinheitlichung mit Klammern. Dass das in C ebenfalls so gehandhabt wird stört mich nicht, da habe ich keine Allergie. ;-)
Ins gleiche Gebiet gehört auch if/then/else immer mit begin/end zu schreiben unabhängig davon, ob ein- oder mehrere Statements vorhanden sind.

Code: Alles auswählen

 
if condition then begin
 statement;
end
else begin
 statement;
end;
 

In MSElang wird obiges übrigens

Code: Alles auswählen

 
if condition then
 statement;
else
 statement;
end;
 

geschrieben, da gibt es zwangsläufig nur eine Form. Auch die Klammern bei parameterlosen Prozeduren sind obligatorisch.

Erwin
Beiträge: 286
Registriert: Mi 16. Sep 2009, 14:15
OS, Lazarus, FPC: Xubuntu 22.04 / x86_64_linux-gtk 2 / L 2.2.0 / FPC 3.2.2

Re: Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von Erwin »

mse hat geschrieben:Nicht unbedingt Geschmackssache sondern Stil/Systematik. Meiner Meinung nach sollten Codeelemente die das gleiche machen auch immer gleich aussehen. Ein Funktions/Prozedur Aufruf hat zwingend Klammern wenn Parameter übergeben werden sollen, darum sollten auch Aufrufe ohne Parameter mit Klammern geschrieben werden um Verwechslungen mit Adressen und Variablen zu vermeiden.

Ja, das Leuchtet ein, zumindest was eben den Still/Aussehen betrifft. Auch würden sich ein Andere, falls man mehre an dem Code arbeiten, es eher als Funktion/Prozedure erkennen, und somit dies dann besser einordnen können.

Was if then betrifft: Wenn nur ein statement folgt, lasse ich ich begin und end weg, schreibe alles in eine Zeile. Finde dies nun mal übersichtlicher und auch sparsamer.

mse hat geschrieben: Auch die Klammern bei parameterlosen Prozeduren sind obligatorisch.

Garde durch den if then Beispiel frage ich mich jetzt, ob es wirklich nur obligatorisch ist. Weil bei Begin und End öffnet sich bei mir in Gedanken etwas, dann wird statement durchgeführt, und wird dann wieder zu gemacht. Wenn nur ein Statement ist und man lässt Begin und End weg, wird bei mir Gedanklich nicht erst was auf und zu gemacht, sondern gleich statement durchgeführt. Da frage ich mich jetzt uach, ob es mit den Klammern (auf und zu) nicht ähnlich verhält?
Lazarus 2.2.0 / FP 3.2.4

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von mse »

Erwin hat geschrieben:Garde durch den if then Beispiel frage ich mich jetzt, ob es wirklich nur obligatorisch ist.

In MSElang sind Klammern bei Prozeduraufrufen obligatorisch.
Weil bei Begin und End öffnet sich bei mir in Gedanken etwas, dann wird statement durchgeführt, und wird dann wieder zu gemacht. Wenn nur ein Statement ist und man lässt Begin und End weg, wird bei mir Gedanklich nicht erst was auf und zu gemacht, sondern gleich statement durchgeführt. Da frage ich mich jetzt uach, ob es mit den Klammern (auf und zu) nicht ähnlich verhält?

Darum verzichtet MSElang ja auf begin im if-block und hat dafür ein obligatorisches end. In Pascal Programmen haben die meisten if-Blöcke mehrere Statements, es macht also Sinn grundsätzlich auch if-Blöcke mit Einzelstatetments gleich zu schreiben um dem im eigenen Kopf eingebauten Parser die Arbeit zu erleichtern. Zudem, wenn man einen then oder else Block ohne begin/end erweitert, darf man das zusätzliche begin/end nicht vergessen oder es passiert ungewolltes. ;-)

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

Re: Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von Mathias »

Nochmals zum ursprünglichen Thema zurück, Turbo-Pascal erzeugt hier einen Syntax-Fehler:

Code: Alles auswählen

WriteLn();


Darum verzichtet MSElang ja auf begin im if-block und hat dafür ein obligatorisches end.
Wird hier nicht das normale FPC verwendet ?

Ich schreibe es in der Regel auch so:

Code: Alles auswählen

if condition then begin
 statement;
end else begin
 statement;
end;

Sowas ist schon fehleranfällig:

Code: Alles auswählen

if a = b then
  WritelLn(a);
  WritelLn(b);
Ichmachewas;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von mse »

Mathias hat geschrieben:
Darum verzichtet MSElang ja auf begin im if-block und hat dafür ein obligatorisches end.
Wird hier nicht das normale FPC verwendet ?

MSElang ist eine neue von Free Pascal abgeleitete Programmiersprache und ein neuer Compiler mit LLVM Backend der auch Free Pascal Code übersetzen kann.

Erwin
Beiträge: 286
Registriert: Mi 16. Sep 2009, 14:15
OS, Lazarus, FPC: Xubuntu 22.04 / x86_64_linux-gtk 2 / L 2.2.0 / FPC 3.2.2

Re: Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von Erwin »

mse, ich dachte mit MSElang meinst Du einen Teil von FreePascal? Mir wäre schon recht, wenn wir uns von FC nicht zu sehr entfernen, bzw. im Kern gar nicht entfernen. Weiß nämlich nicht so recht, wie weit man von MSElang dann dies auf FC übertragen kann. Es könnte ja auch sein, dass eben einer der Stärken von MSElang jene ist, dass bei Proceduren die Klammern obligatorisch ist, während bei FC? Aber zugegeben, interessant ist es dennoch, wie dort es mit dem If ist. Das erste mal als ich vor Jahren in einem Programmierbuch über If lass, da beschrieb der Autor if als etwas, dass nur eine Art Abzweigung mit nur einem Befehl/Statement sein soll. Er hat in seinem Buch dann 2 Statement bei gleicher Überprüfung auf 2 If verteilt. Und erwähnte das mit dem Begin und End bei if eher als Art Notlösung, was er selber für ein Unding hielt, weil man stattdessen ja eine Procedure/Function schreiben könnte, so der Autor. Inzwischen ist es also sogar so, dass man damit rechnet, dass bei If dann mehre Befehle folgen?

Mathias, ja es geht um FCP. Danke. Wäre mir zumindest neu, wenn ich was anderes nutzen würde, da es die Standardinstallation von Lazarus ist.

Mir fällt auf, dass ihr beide Begin in die gleiche Zeile von if schreibt?
Ich mach es so:

Code: Alles auswählen

 
if condition then
begin
  statement1
  statement2
end;
 

Falls noch ein else kommt, entweder dann alles in eine Zeile (bei einem Statement) oder dann auch wieder Begin extra.
Bin jetzt aber am grübeln? Wenn mehre Zeilen nach dem if eingerückt kommen, ist so mit eigentlich auch erkennbar, dass dies noch zum dem If gehört.

Zurück zu den Klammern.
Also gehen tut ja Augenscheinlich beides. Aber das war ja von Anfang an klar. Aber habe bis jetzt den Eindruck, dass keiner wirklich weiß, aus welchen ... technischen (?) Grund man nur diese eine oder andere Schreibweise nutzen sollte?
Gibt es da keine Geschwindigkeitsunterschiede, was die Aufführung betrifft?
Oder was die Geschwindigkeit das Compilieren betrifft?
Ist da auch nichts darüber bekannt, dass die eine oder andere Schreibweise eventuell die Gefahr, dass der Compiler sich verschluckt, vergrößert?

Hm... muss also dann wohl für mich selber entscheiden, wie ich es schreiben will?
Lazarus 2.2.0 / FP 3.2.4

Antworten