Irgendwelche Vorschläge?
Irgendwelche Vorschläge?
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.
- af0815
- Lazarusforum e. V.
- Beiträge: 6219
- 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?
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).
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Irgendwelche Vorschläge?
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:
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...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: Irgendwelche Vorschläge?
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;
-
- Beiträge: 6214
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Irgendwelche Vorschläge?
Ein Ausnahme gibt es, wo es kein "forward" braucht, dies ist bei den Pointern.
Aber sobald es in einem anderen type-Block ist geht es nicht mehr:
Und folgendes geht auch, habe es kürzlich rausgefunden:
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.
Code: Alles auswählen
type
PTest = ^TTest;
TTest = byte;
Code: Alles auswählen
type
PTest = ^TTest; // not found
type
TTest = byte;
Code: Alles auswählen
type
TBone = record
Child: array of TBone;
end;
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
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Irgendwelche Vorschläge?
genau das ist mir passiertMathias hat geschrieben: ↑Mo 25. Dez 2023, 14:04Aber sobald es in einem anderen type-Block ist geht es nicht mehr:Code: Alles auswählen
type PTest = ^TTest; // not found type TTest = byte;
Ich habe es zu gut gemeint und ein zweites Type geschrieben
Hat ne ganze Weile gedauert bis ich dahinter kam....
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 6214
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Irgendwelche Vorschläge?
Ich hatte mal recht lange geübt, als ich ein C-Header übersetzte.genau das ist mir passiert
Ich habe es zu gut gemeint und ein zweites Type geschrieben
Hat ne ganze Weile gedauert bis ich dahinter kam....
Mit hatte da h2pas ein Strich durch die Rechnung gemacht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- 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?
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