Funktion als Parameter - Aufruf?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Funktion als Parameter - Aufruf?

Beitrag von Eclipticon »

Hi,

in Code nach dem Muster

Code: Alles auswählen

DoSomething(StringFunction1);
DoSomething(StringFunction3);
DoSomething(IntToStr(IntegerFunction1));
DoSomething(IntToStr(IntegerFunction2);
DoSomething(StringFunction2);
DoSomething(FloatToStr(FloatFunction1));
wuerde ich gerne auf Exceptions in StringFunction1, StringFunction2 etc. (die ich nicht veraendern kann) in gleicher Weise reagieren und dann mit dem naechsten DoSomething() weitermachen.

Ich koennte natuerlich jetzt jedes DoSomething() mit einem try except end-Block umgeben ... aber gibt's nicht eine andere Methode? Ist es zB moeglich, ein eigentlichen Funktionsaufruf in DoSomething() zu verlegen und dort des Exception Handling zu machen?

Danke ... und sorry fuer die eventuell bloede Frage!

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: Funktion als Parameter - Aufruf?

Beitrag von Socke »

  • Einheitliche Funktionstypen

    Code: Alles auswählen

    type tmystrfunc = function: String;
  • Für Funktionen, deren Ergebnis umgewandelt werden, einen Wrapper basteln:

    Code: Alles auswählen

    function intfunc1: String;
    begin
    Result := IntToStr(IntegerFunction1);
    end;
  • Array aller aufzurufenden Funktionen

    Code: Alles auswählen

    var a: array[0..1] of tmystrfunc = (@StringFunction1, @intfunc1);
  • Alles in einer Schleife abarbeiten

    Code: Alles auswählen

    for i := low(a) to high(a) do
    try
      DoSomething(a[i]());
    except
    // Exception behandeln
    end;
    Nachteilig könnte sich auswirken, dass für jede Funktion ein eigener Try-Except-Block durchlaufen wird. Wenn du also wirklich viele (einige Dutzend) Funktionen aufrufen willst oder diese zeitkritisch sind, solltest du die Schleife umstellen (bspw. per Rekursion in einen neuen Try-Except-Block wechseln, wenn eine Exception auftritt).[/code]
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Funktion als Parameter - Aufruf?

Beitrag von Eclipticon »

Vielen Dank, Socke ... ich befuerchte, bald mal muss ich Dich fuer Deine ganze Unterstuetzung entlohnen ;-)

Eine Frage noch: Warum sieht die Sprachspezifikation vor, dass ich beim Aufruf der tmystrfunc unbedingt die leeren Klammern brauche?

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: Funktion als Parameter - Aufruf?

Beitrag von Socke »

Eclipticon hat geschrieben:Vielen Dank, Socke ... ich befuerchte, bald mal muss ich Dich fuer Deine ganze Unterstuetzung entlohnen ;-)
Eine etwas schlauere Welt ist Lohn genug :roll:
Eclipticon hat geschrieben:Eine Frage noch: Warum sieht die Sprachspezifikation vor, dass ich beim Aufruf der tmystrfunc unbedingt die leeren Klammern brauche?
Um dem Compiler mitzuteilen: Das ist ein Methodenaufruf; ich hätte gerne das Ergebnis der Methode. Andernfalls versucht er den Methodenzeiger (die Methode selbst) weiter zu geben.

Im Delphi-Modus können die Klammern auch weggelassen werden. Im Normalfall ergibt das keine Probleme.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten