Autor Beitrag
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Fr 26.03.04 00:07 
High
mein Infolehrer hat heute nen Gag versucht indem er (sinngemäß) folgendes gezeigt hat:

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: 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.

ausblenden 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 { function Sonstwas };

begin
....
end { function Blahana };


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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Fr 26.03.04 00:18 
lol,
hab gerade ein bisschen rumexperimentiert und bin selber drauf gekommen. 8)

zur Erklärung: unser Infolehrer führt gerade Funktionen ein :roll:
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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 26.03.04 00:56 
@MaxiTB:

Meinst Du sowas?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: Fr 26.03.04 01:00 
<--- Was steht den hier ... ? :P

PS: Jetzt wär ein Klugscheißer Tag nicht schlecht *g*.

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 26.03.04 01:16 
Da steht "Dabei seit: 03.03.2003". :mrgreen:

Aber ich weiß schon, was Du meinst. ; -)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314


D6 Ent, K3 Pro (patched)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314


D6 Ent, K3 Pro (patched)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: 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...:

ausblenden 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 :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure alles;
var
 x : integer;
 temp : string;  // die Variable muss beispielsweise vom Compiler erzeugt werden.....
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
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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!