Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Eine Prozedur innerhalb einer Prozedur


huberttdm850 - Do 04.09.08 10:40
Titel: Eine Prozedur innerhalb einer Prozedur
Hallo

Wer kann mir bitte sagen wie man eine Procedure(1) in einer Procedur(2) aufruft damit man die Variablen der (2) mitbenutzen kann (Will kein GOTO haben)
z.B.:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure blabla_1
var 
 a:integer;
begin
  .....
  .....
end;

Wie muss ich nun die zweite Procedur anlegen, damit ich die Variable a mitbenutzen kann?

Danke


Gruß hubert

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


elundril - Do 04.09.08 10:44

wie wäre es mit einer funktion und parametern??

lg elundril


huberttdm850 - Do 04.09.08 10:51
Titel: Re: Eine Prozedur innerhalb einer Prozedur
Ja, das ist mir schon klar dass ich das auch machen kann, aber wenn es viele Objekte und Variablen innerhalb dieser Procedur gibt, dann möchte aich auch auf alle zugreifen können.

Bitte nur solche Antworten die auch meine Frage beantworten können, DANKE!

Gruß
hubert


elundril - Do 04.09.08 10:54

gut, wenn das so ist dann: da die variablen lokal definiert sind kann man sie in einer anderen prozedur imho nicht drauf zugreifen. globale würden helfen.

lg elundril


huberttdm850 - Do 04.09.08 11:01
Titel: Re: Eine Prozedur innerhalb einer Prozedur
Ja, das würde natürlich funktionieren, aber ich möchte die lokalen Variablen auch belassen und nicht globale daraus machen.

Ich hab diese Technik bereits in einem Codestück gesehen, aber leider weiß ich nicht mehr wie man die beiden Proceduren schachteln muss damit das funktioniert und deshalb hätt ich hier mal ganz gerne Rat gesucht!


Gruß
hubert


Gausi - Do 04.09.08 11:02

Das geht, wenn man lokale Prozeduren nimmt. Sollte man imho aber nur in Ausnahmefällen tun. Besser wäre wahrscheinlich, das Konzept zu überdenken. ;-)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure blabla_1 
var  a:integer; 

  procedure blabla2
  var b: Integer;
  begin
    b := a + 42;  
  end

begin 
..... 
..... 
end;


huberttdm850 - Do 04.09.08 11:08
Titel: Re: Eine Prozedur innerhalb einer Prozedur
JAaaaaaaaaaa, genau das hab ich gesucht, eine lokale procedur!

Ich verwende dies auch nur um innerhalb der procedur mehr struktur reinzubringen, ohne dei ganze neu schreiben zu müssen, aber ich geb dir natütlch recht!!

Gruß hubert


Timosch - Do 04.09.08 11:22

user profile iconhuberttdm850 hat folgendes geschrieben:
JAaaaaaaaaaa, genau das hab ich gesucht, eine lokale procedur!

Ich verwende dies auch nur um innerhalb der procedur mehr struktur reinzubringen, ohne dei ganze neu schreiben zu müssen, aber ich geb dir natütlch recht!!

Gruß hubert

Mehr Struktur? Also Procedures machen einen Code zwar i.d.R. schon übersichtlicher, aber in dem Fall wohl eher das Gegenteil...


Motzi - Do 04.09.08 19:07

Nested functions machen durchaus Sinn und ermöglichen sehr elegante Konstrukte. Die Gültigkeit dieser Funktionen ist auf die umschließende Funktion beschränkt, weshalb es möglich ist auf die lokalen Variablen der umschließenden Funktion zuzugreifen (vorrausgesetzt man ruft sie direkt auf und nicht über einen Funktionszeiger - z.B. Callback). Dadurch sind sie dafür prädestiniert sich wiederholende Codestücke innerhalb einer Funktion in einer solchen nested function zusammenfassen - vor allem dann, wenn innerhalb dieses Codes massiver Gebrauch von lokalen Variablen stattfindet, wodurch eine Auslagerung in eine externe Funktion nur schwer bis gar nicht möglich wäre.

Meiner Meinung nach sind nested functions also durchaus Teil eines guten Konzeptes, auch wenn das in diesem Thread bisher anders aufgefasst wird..

Gruß, Motzi


Tilman - Do 04.09.08 19:11

Ja sehe ich auch so. Benutze diese ebenfalls, wenn auch nur selten. Wenn eine Prozedur nur von einer anderen aufgerufen wird, so erhöht es die Lesbarkeit sie auch nur in dieser zu definieren (Bei einem großen Projekt mit hunderten von Funktionen). Allerdings benutzte ich bisher stets übergabeparameter, auch wenn dies offenbar nicht nötig ist.


Hidden - Do 04.09.08 20:55

Hi,

imho macht eine lokale prozedur oder Funktion Sinn, wenn sie die Lesbarkeit des Codes verbessert und dabei auf keinen Fall nochmal verwendet wird. Eine vernünfitge Formatierung ist mir dabei leider noch nicht untergelaufen :?.

Kleines Beispiel:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function GgT(a, b: Integer): Integer;  //größter gemeinsamer Teiler von a und b
      procedure Sortiere;  //tauscht die größere Zahl nach a
      var
        Tausche: Integer;
      begin
        if a < b then begin
          Tausche := a;
          a := b;
          b := Tausche;
        end;
      end;
begin
  repeat
    Sortiere;
    a := a mod b;
  until a = 0;
  result := b;
end;


Einige Sonderfälle müssten hier noch behandelt werden, ist nur ein Beispiel. Hier finde ich erhöht es die Übersicht des Codes z.B. stark.

mfG,


Delete - Do 04.09.08 21:40

Ich kann motzi nur zustimmen. Hinzukommt, dass man es dem Compiler leichter macht den Code zu optimieren.