Irgendwelche Vorschläge?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
EvanHardy
Beiträge: 1
Registriert: Mi 13. Dez 2023, 01:42

Irgendwelche Vorschläge?

Beitrag von EvanHardy »

Grüße, ich habe eine Frage, die vielleicht etwas naiv ist. Ist es möglich, dass eine Funktion A bei Bedarf eine Funktion B aufruft und umgekehrt, wobei Funktion B dann Funktion A aufrufen kann? Derzeit scheint dies nur in einer Richtung möglich zu sein, nämlich für die aufrufende Funktion, die im Programm auf die aufgerufene Funktion folgt. Gibt es eine Problemumgehung für dieses Problem oder muss ich mein Projekt zum Rechnen mit langen Zahlen neu erstellen? Für Vorschläge bin ich im Voraus dankbar. Danke schön.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Irgendwelche Vorschläge?

Beitrag von af0815 »

Weil es dein erster Post hier ist. Kannst du uns an einem Beispiel zeigen wo dein Problem liegt. Weil ich sehe abgesehen von eine Möglichen Rekursion kein Problem.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Irgendwelche Vorschläge?

Beitrag von siro »

Guten Morgen und willkommen im Forum,

wenn ich dein Problem richtig verstanden habe, dann wäre dies hier die Lösung:

Normalerweise gibt es einen Fehler, da ja eine der Funktion hinter der anderen steht:
und dann meldet der Compiler: identifier not found "FuncB"

Aber man kann die Funktion Vorher mit dem reservierten Wort Forward definieren
und dann geht das:

Code: Alles auswählen

Function FuncB(value:Integer):Integer; Forward;

Function FuncA(value:Integer):Integer;
begin
  FuncB(value);     // ich kann die Funktion nun aufrufen, obwohl sie dahinter steht....
end;

Function FuncB(value:Integer):Integer;
begin
  FuncA(value);
end;

begin
  FuncA(23);
end.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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

Re: Irgendwelche Vorschläge?

Beitrag von theo »

Das geht übrigens so ähnlich auch mit Klassen, allerdings ist dort "forward" nicht nötig.

Code: Alles auswählen

type
   TClassB = class;
   TClassA = class
     PropB: TClassB;
   end;
   TClassB = class
     PropA: TClassA;
   end;

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Irgendwelche Vorschläge?

Beitrag von Mathias »

Ein Ausnahme gibt es, wo es kein "forward" braucht, dies ist bei den Pointern.

Code: Alles auswählen

type
  PTest = ^TTest;
  TTest = byte;  
Aber sobald es in einem anderen type-Block ist geht es nicht mehr:

Code: Alles auswählen

type
  PTest = ^TTest;  // not found
type
  TTest = byte;
Und folgendes geht auch, habe es kürzlich rausgefunden:

Code: Alles auswählen

type
  TBone = record
    Child: array of TBone;
  end;
Funktioniert aber nur mit dynamischen Arrays. Mit einer statischen könnte es gar nicht gehen, die würde endlos rekursiv werden, genau das gleiche direkt ohne ohne Array.
Der Grund, ein dynamischen Array kann nil habe und die Rekursion ist dann vorbei.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Irgendwelche Vorschläge?

Beitrag von siro »

Mathias hat geschrieben:
Mo 25. Dez 2023, 14:04
Aber sobald es in einem anderen type-Block ist geht es nicht mehr:

Code: Alles auswählen

type
  PTest = ^TTest;  // not found
type
  TTest = byte;
genau das ist mir passiert 8)
Ich habe es zu gut gemeint und ein zweites Type geschrieben
Hat ne ganze Weile gedauert bis ich dahinter kam.... :roll:
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Irgendwelche Vorschläge?

Beitrag von Mathias »

genau das ist mir passiert 8)
Ich habe es zu gut gemeint und ein zweites Type geschrieben
Hat ne ganze Weile gedauert bis ich dahinter kam.... :roll:
Ich hatte mal recht lange geübt, als ich ein C-Header übersetzte.
Mit hatte da h2pas ein Strich durch die Rechnung gemacht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Irgendwelche Vorschläge?

Beitrag von PascalDragon »

siro hat geschrieben:
Mo 25. Dez 2023, 08:20
Aber man kann die Funktion Vorher mit dem reservierten Wort Forward definieren
und dann geht das:
Oder man packt die Funktionen in eine Unit mit deren Deklarationen in der interface-Sektion. Die Deklarationen der interface-Sektion fungieren nämlich auch als forward-Deklarationen. Wenn man eine oder beide Funktionen nicht in der interface-Sektion haben möchte, dann sollte natürlich die forward-Direktive genutzt werden.
FPC Compiler Entwickler

Antworten