Übergabeparameter bei prozeduren

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Übergabeparameter bei prozeduren

Beitrag von mintpc »

Hallo zusammen,

bei Delphi können globale Variablen und Übergabevariablen in Prozeduren gleichen Namen haben.

Beispiel:

Code: Alles auswählen

type
  TKlasse = class
     Beschreibung : String;
     Norden, Sueden, Westen, Osten : TKlasse;
     procedure referenziere_selbst (norden, osten, sueden, westen : TKlasse); 
  end;

Lazarus meckert die doppelten Variablennamen an. Offensichtlich geht das also nicht mehr.
Warum?

Danke vielmals

mintpc

Keifor
Beiträge: 31
Registriert: Sa 28. Aug 2010, 15:15
OS, Lazarus, FPC: pc-linux-gnu - Funtoo stable, L trunk, FPC trunk
CPU-Target: i686/x86_64

Re: Übergabeparameter bei prozeduren

Beitrag von Keifor »

Der Compiler (FPC) kennt mehrere Sprachvarianten von Pascal.
Lazarus stellt diese per Standard auf OBJFPC ein durch die Compiler Direktive

{$mode objfpc} im Kopf der Unit/des Programmes.
Einfach zu {$mode delphi} abändern und es sollte entsprechende Delphi Syntax erlauben.

Mehr infos dazu unter: http://www.freepascal.org/docs-html/pro ... 00001.2.16" onclick="window.open(this.href);return false;

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Übergabeparameter bei prozeduren

Beitrag von Scotty »

Geht das wirklich, eine sich selbst referenzierende Klasse? Und wozu sollte dies gut sein?
(TKlasse=class... Norden:TKlasse)

Keifor
Beiträge: 31
Registriert: Sa 28. Aug 2010, 15:15
OS, Lazarus, FPC: pc-linux-gnu - Funtoo stable, L trunk, FPC trunk
CPU-Target: i686/x86_64

Re: Übergabeparameter bei prozeduren

Beitrag von Keifor »

Ja, das geht. Ob Delphi Mode oder OBJFPC Mode ist dabei egal. Die Grundfrage war, warum Parameternamen nicht den gleichen Namen wie Instanzvariablen (Variablen der Klasse) haben dürfen. Das wird in OBJFPC nicht erlaubt mit Begründung: es ist schlechte Praxis (fördert Verwechslungen z.B.)

Warum eine Klasse sich sich selbst Referenzieren kann wozu das nützlich ist, ist ein anderes Thema, allerdings hab ich mal fix was dazu geschrieben:

Es ist nicht das gleiche wie eine Struktur.
Bspw.

Code: Alles auswählen

TMyRecord = record
  a: TRecord;
end;
geht nicht, da TMyRecord noch nicht deklariert ist bis zum Ende der Deklaration.

Code: Alles auswählen

TMyClass = class
  FRef: TMyClass;
end;
geht, da FRef eh nur eine Referenz ist. Sozusagen ein Zeiger auf Objekte des bis dato noch nicht kompletten Typen TMyClass.

Praktischen nutzen hat das Bspw. in verschiedenen Entwurfsmustern.
Beispiel:

Code: Alles auswählen

TAbstractProxy = class
   FNextProxy: TAbstractProxy;
   function proxyCall( cmd: String ): Boolean; virtual;
   function assignNext( AProxy: TAbstractProxy ): Boolean;
   ...
So kann man z.B. von TAbstractProxy Klassen ableiten die einen "Befehl" auf unterschiedliche Art weiterreichen. Bspw. eine Klasse die Befehle an Clients sendet, oder an andere Komponenten oder...

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Übergabeparameter bei prozeduren

Beitrag von mintpc »

Hallo nochmal,

danke für die schnelle Antwort und Erklärung.

Zu dem Sinn der Selbstreferenzierung: Ich bin Lehrer und lasse
als Einstieg in die Objektorientierung gerne ein "Textadventure" schreiben.
Jeder betretbare Raum ist erstmal eine Instanz einer Klasse "TRaum" und
die möglichen Ausgänge (man will sich ja von Raum zu Raum bewegen)
sind Referenzen auf andere Instanzen derselben Klasse.

Klingt komisch, macht den Schülern aber Spaß.

Und der Vorteil als Einstieg ist, dass mit einer einzigen sehr einfachen Klasse
ein ganzes umfangreiches Spiel geschrieben werden kann.

Also, nochmals danke für die Hinweise.

mintpc

Benutzeravatar
theo
Beiträge: 10922
Registriert: Mo 11. Sep 2006, 19:01

Re: Übergabeparameter bei prozeduren

Beitrag von theo »

Keifor hat geschrieben: Das wird in OBJFPC nicht erlaubt mit Begründung: es ist schlechte Praxis (fördert Verwechslungen z.B.)
Ja, ich würde dir auch empfehlen, dich an die Benennungsregeln zu halten und die Sichtbarkeit reinzuschreiben.
Das vereinfacht die Lesbarkeit ungemein, auch für andere.
z.B.

Code: Alles auswählen

type
  TKlasse = class
   private
     fBeschreibung : String;
     fNorden, fSueden, fWesten, fOsten : TKlasse;
   public
     procedure referenziere_selbst (norden, osten, sueden, westen : TKlasse); 
  end;
Also immer "f" für Feld.

Ein Property heisst dann immer ohne "f"

z.B.
property Norden: TKlasse read fNorden write SetNorden;

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Übergabeparameter bei prozeduren

Beitrag von Socke »

theo hat geschrieben:

Code: Alles auswählen

procedure referenziere_selbst (norden, osten, sueden, westen : TKlasse);
[...]
property Norden: TKlasse read fNorden write SetNorden;
Damit hätten aber "Norden" (Eigenschaft) und "norden" (Parameter) wieder den selben Namen. Daher hängt man bei Parametern oft ein "a" oder einen anderen Präfix davor (aValue/AValue/TheOwner).
In Deutsch wäre das dann in etwa: EinNorden, EinOsten, EinSueden, EinWesten: TKlasse) (wobei man EinNorden nicht mit einnorden verwechseln sollte :D).

Übrigens: TKlasse ist auch kein Optimaler Name. Dass TKlasse eine Klasse im objektorientierten Sinne ist sehen wir an der Deklaration.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Übergabeparameter bei prozeduren

Beitrag von pluto »

Ich frage mich gerade wie der Compilier unterschiedet ob jetzt eine Variable in der Paramenter liste genutzt werden soll oder von der Klasse selbst, wenn sie gleich klingen.

und wie möchtest du die Zuweisung machen ?
test:=test ?
das macht doch wenig Sinn *G*.....

Die OOP ist eine feine Sache, wenn SIE RICHTIG angewendet wird *G*......
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Übergabeparameter bei prozeduren

Beitrag von Socke »

pluto hat geschrieben:Ich frage mich gerade wie der Compilier unterschiedet ob jetzt eine Variable in der Paramenter liste genutzt werden soll oder von der Klasse selbst, wenn sie gleich klingen.
Sowas nennt sich Sichtbarkeit. Der innere Block überschreibt immer den äußeren. Daher gilt (so weit ich denke):
Lokale Variablen -> Prozedur-Parameter -> Instanzvariablen (Felder) -> Globale Variablen
Ein Zugriff auf verdeckte Elemente kann ich mir nur über einen mehr qualifizierenden Namen vorstellen: also <unit>.<var>/<objekt>.<feld>
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Übergabeparameter bei prozeduren

Beitrag von pluto »

Ich kann mir sowas einfach nicht vorstellen. So kann man doch kein Zugang zu den Glaobeln Variablen erlangen und auch keinen zu den Parametern. Meiner Meinung. Es würde nur eins von beiden gehen.
MFG
Michael Springwald

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Übergabeparameter bei prozeduren

Beitrag von Teekeks »

pluto hat geschrieben:So kann man doch kein Zugang zu den Glaobeln Variablen erlangen
doch, über unit.var

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Übergabeparameter bei prozeduren

Beitrag von pluto »

doch, über unit.var
Ach so, dass ist also der "Trick"....
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Übergabeparameter bei prozeduren

Beitrag von Socke »

Teekeks hat geschrieben:doch, über unit.var
Hab ich das nicht so geschrieben oder kann ich nicht mehr lesen :)?
Das Zauberwort heißt übrigens "voll qualifizierender Name".
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Übergabeparameter bei prozeduren

Beitrag von Teekeks »

Ja, das hast du so geschrieben, aber da pluto das scheinbar nicht gesehen hatte, habe ich es einfach mal wiederholt. :)

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Übergabeparameter bei prozeduren

Beitrag von lrlr »

Scotty hat geschrieben:Geht das wirklich, eine sich selbst referenzierende Klasse? Und wozu sollte dies gut sein?
(TKlasse=class... Norden:TKlasse)

> Und wozu sollte dies gut sein?

in diesem fall, keine ahnung, aber

bei "jedem" baum hast du das (als referenz auf Parent z.b. )

TMenuItem.Parent

ist z.b. ein TMenuItem

Antworten