Autor |
Beitrag |
Horschdware
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Fr 26.03.04 00:07
High
mein Infolehrer hat heute nen Gag versucht indem er (sinngemäß) folgendes gezeigt hat:
Delphi-Quelltext 1: 2: 3: 4: 5:
| function Blahana(param1, param2 : integer) : integer; begin function Sonstwas(was, weiss, ich : string) : boolean; begin .... |
Kurz: Eine Funktion innerhalb einer Funktion.
Das hat natürlich nicht funktioniert, allerdings stellt sich mir da die Frage: Wäre so etwas überhaupt möglich, wenn man es gescheit machen würde?
Kann man Funktionen derart verschachteln?
Was meint ihr dazu?
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Fr 26.03.04 00:11
das funktioniert, wenn man die innere funktion vor dem begin deklariert...
sie ist dann aber auch nur innerhalb der äußeren funktion verfügbar
|
|
Brueggendiek
      
Beiträge: 304
Win 98, Win98SE, Win XP Home
D5 Std
|
Verfasst: Fr 26.03.04 00:15
Hallo!
Natürlich geht das "Verschachteln" von Prozeduren und Funktionen - man muß es nur richtig schreiben. Überall dort, wo Deklarationen erlaubt sind, kann man auch Prozeduren/Funktionen deklarieren.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| function Blahana(param1, param2 : integer) : integer; function Sonstwas(was, weiss, ich : string) : boolean; begin .... end ;
begin .... end ; |
Die Funktion "Sonstwas" kann dann nur innerhalb von "Blanaha" aufgerufen werden. Sie kann allerdings auf alle Variablen (auch die Parameter) der umgebenden Funktion zugreifen.
Gruß
Dietmar Brüggendiek
|
|
MaxiTB
      
Beiträge: 679
Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
|
Verfasst: Fr 26.03.04 00:16
Jo - kann nur beipflichten - sowas gibts unter object pascal. Dafür gibts keine sub-Klassen oder Typen (die man sehr oft brauchen kann).
Najo - da hat wahrscheinlich eine Tipse die Begriffe Methode/Klasse in der Ursprungs-Spec vertauscht und dann wollte es keiner gewesen sein und alle fanden es toll  .
_________________ Euer Mäxchen
Wer früher stirbt, ist länger tot.
|
|
Horschdware 
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Fr 26.03.04 00:18
lol,
hab gerade ein bisschen rumexperimentiert und bin selber drauf gekommen.
zur Erklärung: unser Infolehrer führt gerade Funktionen ein
da wollte er jetzt dann mal zeigen, was man mit funktionen NICHT machen kann.
mir kam das aber gleich irgendwie verdächtig vor. ich hatte irgendwie so das gefühl, dass das eben doch gehen muss.
und tatsach: das tut
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 26.03.04 00:56
@MaxiTB:
Meinst Du sowas?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| type TOuterClass = class strict private myField: Integer; public type TInnerClass = class public myInnerField: Integer; procedure innerProc; end;
procedure outerProc; end; |
In Delphi 8 geht das. 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
MaxiTB
      
Beiträge: 679
Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
|
Verfasst: Fr 26.03.04 01:00
<--- Was steht den hier ... ?
PS: Jetzt wär ein Klugscheißer Tag nicht schlecht *g*.
_________________ Euer Mäxchen
Wer früher stirbt, ist länger tot.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 26.03.04 01:16
Da steht "Dabei seit: 03.03.2003".
Aber ich weiß schon, was Du meinst. ; -)
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 26.03.04 09:55
Hatte ich schon mal erwähnt, daß verschachtelte Funktionen/Prozeduren den Performance-Tod bewirken? Lasst sowas lieber sein.
Cu,
Udontknow
|
|
Sven
      
Beiträge: 314
D6 Ent, K3 Pro (patched)
|
Verfasst: Fr 26.03.04 10:00
Udontknow hat folgendes geschrieben: | Hatte ich schon mal erwähnt, daß verschachtelte Funktionen/Prozeduren den Performance-Tod bewirken? Lasst sowas lieber sein.
Cu,
Udontknow |
Wieso, weshalb, warum? Gibt es ein paar mehr Info's?
_________________ MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 26.03.04 10:25
Hmmm.., Irgendwo hatte ich mal gelesen, daß da ineffizienter Code generiert wird, um die Parameter der äußeren Funktion der inneren zur Verfügung zu stellen. Allerdings kann ich gerade mit Beispielcode einen Performanceverlust nicht nachvollziehen... *grübel*...
Cu,
Udontknow
|
|
Sven
      
Beiträge: 314
D6 Ent, K3 Pro (patched)
|
Verfasst: Fr 26.03.04 11:19
Udontknow hat folgendes geschrieben: | Hmmm.., Irgendwo hatte ich mal gelesen, daß da ineffizienter Code generiert wird, um die Parameter der äußeren Funktion der inneren zur Verfügung zu stellen. Allerdings kann ich gerade mit Beispielcode einen Performanceverlust nicht nachvollziehen... *grübel*...
Cu,
Udontknow |
Wenn da wirklich ineffizienter Code bei rüberkommen sollte, wie sieht es denn dort mit den Funktionen aus, die ja auch auf Daten aus dem globalen Programmbereich zugreifen.
Also so ganz glauben tue ich das nicht.
_________________ MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
|
|
catweasel
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: Fr 26.03.04 11:34
ich hab mir mal sagen lassen, dass in so einem Fall die Implementation der inneren Funktion beim compilieren jeden Aufruf in der äusseren ersetzt...
Also für...:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure aussen; function innen :string; var x : integer; begin Result := 'Eine Übersicht der natürlichen Zahlen von 1 bis 10 (sortiert): '); for x := 1 to 10 do Result := Result+inttostr(x)+','); end;
begin showmessage(innen); showmessage('Und weils so schön war, gleich nochmal...'); showmessage(innen); end; |
Könnte man auch :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure alles; var x : integer; temp : string; begin temp := 'Eine Übersicht der natürlichen Zahlen von 1 bis 10 (sortiert): '); for x := 1 to 10 do temp := temp+inttostr(x)+','); showmessage(temp);
temp := 'Eine Übersicht der natürlichen Zahlen von 1 bis 10 (sortiert): '); for x := 1 to 10 do temp := temp+inttostr(x)+','); showmessage(temp);
end; |
schreiben...
Das sieht schon verdächtig nach Ineffizienz aus..
Wie gesagt ich hab auch keine so ganaue Ahnung, aber so wurde es mir erklärt.. das es zu Redundanz im Code führen würde...
Und die Schleife in diesem Beispiel würde tatsächlich 2mal durchlaufen werden, da dieser tempwert aus irgendeinem Grund nicht gesichert werden kann.....
also ein
Delphi-Quelltext 1: 2:
| showmessage(temp); showmessage(temp); |
würde hier "hinter den Kulissen" nicht erfolgen....
Catweasel
ps: Vielleicht macht sich das in einem Performancetest bemerkbar, wenn man das mal Übertreibt und so bis in eben 30-40 verschachtelt (mit vielen unterschiedlichen Parametertypen und so)....  Vielleicht testet das ja mal wer...
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 26.03.04 11:46
Also das Beispiel ist irgendwie unsinnig. Logisch, dass es nicht effizient ist, wenn ich zweimal dieselbe Prozedur aufrufe. Aber das hat nichts damit zu tun, ob die Funktion verschachtelt ist.
Und wenn es so ist, dass verschachtelte Funktionen vom Compiler einfach den Funktionennamen durch die Funktion ersetzt, dann ist das sehr schnell. Nicht umsonst gibt man bei C++ das Wörtchen "inline" an oder arbeitet sogar mit #define, um kleine Prozeduren "direkt" an die entsprechenden Stellen zu schreiben.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Fr 26.03.04 13:04
Udontknow hat folgendes geschrieben: | Hmmm.., Irgendwo hatte ich mal gelesen, daß da ineffizienter Code generiert wird, um die Parameter der äußeren Funktion der inneren zur Verfügung zu stellen. Allerdings kann ich gerade mit Beispielcode einen Performanceverlust nicht nachvollziehen... *grübel*... |
Das stimmt nicht so ganz..!! Es müssen natürlich ein paar entsprechende "Manipulationen" am Stack vorgenommen werden um alle Variablen und Parameter auch in der Subroutine zur Verfügung zu stellen, allerdings kann man sich damit auch das Übergeben von Parametern an die Subroutine sparen..! Man kann das also nicht so verallgemeinern..
PS: Hagen hat dazu auch mal was in der Delphi-Praxis geschrieben...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|