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

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

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

Beitragvon Erwin » 22. Jun 2018, 20:43 [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

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 26. Jun 2018, 09:13, insgesamt 2-mal geändert.
Win 7 / Lazarus 1.6 / FP 3.0.0 / x86_64-win64-win32/win64
Erwin
 
Beiträge: 216
Registriert: 16. Sep 2009, 13:15
OS, Lazarus, FPC: Xubuntu 16.04 / x86_64_linux-gtk 2 / L 1.6+dfsg-1 / FPC 3.0.0 | 
Nach oben

Beitragvon Mathias » 22. Jun 2018, 20:50 Re: Procedute ohne Var dennoch mit oder ohne '()'?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon kupferstecher » 22. Jun 2018, 21:42 Re: Procedute ohne Var dennoch mit oder ohne '()'?

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.
kupferstecher
 
Beiträge: 167
Registriert: 17. Nov 2016, 11:52

Beitragvon mse » 23. Jun 2018, 07:03 Re: Procedute ohne Var dennoch mit oder ohne '()'?

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.
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon Erwin » 23. Jun 2018, 12:34 Re: Procedute ohne Var dennoch mit oder ohne '()'?

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).
Win 7 / Lazarus 1.6 / FP 3.0.0 / x86_64-win64-win32/win64
Erwin
 
Beiträge: 216
Registriert: 16. Sep 2009, 13:15
OS, Lazarus, FPC: Xubuntu 16.04 / x86_64_linux-gtk 2 / L 1.6+dfsg-1 / FPC 3.0.0 | 
Nach oben

Beitragvon Mathias » 23. Jun 2018, 12:47 Re: Procedute ohne Var dennoch mit oder ohne '()'?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon kupferstecher » 23. Jun 2018, 13:21 Re: Procedute ohne Var dennoch mit oder ohne '()'?

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)...
kupferstecher
 
Beiträge: 167
Registriert: 17. Nov 2016, 11:52

Beitragvon m.fuchs » 23. Jun 2018, 14:57 Re: Procedute ohne Var dennoch mit oder ohne '()'?

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
m.fuchs
 
Beiträge: 1972
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Erwin » 24. Jun 2018, 09:30 Re: Procedure ohne Var dennoch mit oder ohne '()'?

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?
Win 7 / Lazarus 1.6 / FP 3.0.0 / x86_64-win64-win32/win64
Erwin
 
Beiträge: 216
Registriert: 16. Sep 2009, 13:15
OS, Lazarus, FPC: Xubuntu 16.04 / x86_64_linux-gtk 2 / L 1.6+dfsg-1 / FPC 3.0.0 | 
Nach oben

Beitragvon mse » 24. Jun 2018, 10:11 Re: Procedure ohne Var dennoch mit oder ohne '()'?

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.
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon Erwin » 24. Jun 2018, 11:54 Re: Procedure ohne Var dennoch mit oder ohne '()'?

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?
Win 7 / Lazarus 1.6 / FP 3.0.0 / x86_64-win64-win32/win64
Erwin
 
Beiträge: 216
Registriert: 16. Sep 2009, 13:15
OS, Lazarus, FPC: Xubuntu 16.04 / x86_64_linux-gtk 2 / L 1.6+dfsg-1 / FPC 3.0.0 | 
Nach oben

Beitragvon mse » 24. Jun 2018, 12:24 Re: Procedure ohne Var dennoch mit oder ohne '()'?

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. ;-)
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon Mathias » 24. Jun 2018, 15:34 Re: Procedure ohne Var dennoch mit oder ohne '()'?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon mse » 24. Jun 2018, 15:53 Re: Procedure ohne Var dennoch mit oder ohne '()'?

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.
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon Erwin » 25. Jun 2018, 09:54 Re: Procedure ohne Var dennoch mit oder ohne '()'?

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?
Win 7 / Lazarus 1.6 / FP 3.0.0 / x86_64-win64-win32/win64
Erwin
 
Beiträge: 216
Registriert: 16. Sep 2009, 13:15
OS, Lazarus, FPC: Xubuntu 16.04 / x86_64_linux-gtk 2 / L 1.6+dfsg-1 / FPC 3.0.0 | 
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 6 Gäste

porpoises-institution
accuracy-worried