Seite 1 von 1

Rekursive Makros

Verfasst: 25.05.2016 11:03
von Imhotheb
Grüße Zusammen,

habe gerade festgestellt das
PB-Hilfe hat geschrieben:... Die Makros können rekursiv verwendet werden; ...
nicht so ganz zutrifft.

Dazu ein einfaches Beispiel:

Code: Alles auswählen

Macro IncludeData(Length, Value)
  CompilerIf MacroExpandedCount <= Length 
    Data.b Value
    IncludeData(Length, Value)
  CompilerEndIf
EndMacro


DataSection
  IncludeData(100, $23)
EndDataSection
Wollte das Makro verwenden um schnell und einfach "Platzhalter" zu erstellen, aber scheint ja so nicht zu funktionieren.
Die Meldung vom Compiler: "Endlose Rekursivität im Makro festegestellt", sollte vielleicht nicht gleich nach der 2. Erweiterung auftauchen :bluescreen:
Wie oft durchläuft der precompiler von pb den code? Bis alles aufgelöst ist, oder nur x Durchläufe?

Re: Rekursive Makros

Verfasst: 25.05.2016 14:29
von #NULL
wenn man statt 100 als length 0 angibt dann sieht mann dass das CompilerIf zu dem zeitpunkt noch gar nicht evaluiert wird und er genauso mit dem 2 durchlauf abricht.

Re: Rekursive Makros

Verfasst: 25.05.2016 15:55
von NicTheQuick
Ich habe auch noch nicht herausgefunden, was hier mehr Priorität hat. 'CompilerIf' oder 'Macro' oder 'MacroExpandedCount'. Das ist teilweise ganz schön unlogisch in PB.

Re: Rekursive Makros

Verfasst: 25.05.2016 19:19
von Nino
Ich würde gern wissen, wie denn eine gültige rekursive Makrodefinition aussieht. Ein Beispiel in der Hilfe wäre sicher nützlich.

( Ein "Anfänger"-Thema ist dies allerdings wohl eher nicht. :-) )

Re: Rekursive Makros

Verfasst: 25.05.2016 22:00
von #NULL
freak meint erst Macro dann CompilerIf
http://www.purebasic.fr/english/viewtop ... 52#p134252
hab ich auch nur gefunden weil ich nicht weiß wie rekursion mit macros funktionieren soll, wenn nicht mit CompilerIf. die hilfe sagt mittels '#', versteh ich aber trotzdem nicht.

Re: Rekursive Makros

Verfasst: 26.05.2016 00:11
von GPI
Das klappt schon mal nicht:

Code: Alles auswählen

Macro part1
  re
EndMacro
Macro part2
  cu
EndMacro


Macro recu(a,b)
  CompilerIf a<b
    part1#part2(b,a)
  CompilerElse
    Debug ""+a+" "+b
  CompilerEndIf
EndMacro

recu(10,11)
Mal ehrlich, rekursive Makros? Wie soll das gehen? Man kann ja keine Abbruchbedingung definieren.

Kann es sein, das ein Makro-Aufruf in einen Makro möglich ist? Das ist aber doch nicht rekursive...

Re: Rekursive Makros

Verfasst: 26.05.2016 13:02
von Imhotheb
Dank an allen die sich hier beteidigen.

Scheint so, als gibt es im Moment da keine Lösung.

Der Vollständigkeit halber, hier noch meine Versuche (die allerdings alle nicht funktionieren) ... und jetzt gehen mir auch langsam die Ideen aus :coderselixir:

Code: Alles auswählen

  
Macro IncludeData(Length, Value)
  
  CompilerIf MacroExpandedCount <= Length
    UndefineMacro Inc2
    Macro Inc2(Length, Value)
      Data.b Value
      IncludeData(Length, Value)
    EndMacro  
    
  CompilerElse
    UndefineMacro Inc2
    Macro Inc2(Length, Value)
    EndMacro
  CompilerEndIf  
  
  Inc2(Length, Value)  
   
EndMacro


; klappt nicht
; -------------------------------------------
; Macro Inc2(Length, Value)
; EndMacro
; 
; Macro Check(Length)
;   CompilerIf MacroExpandedCount <= Length
;     UndefineMacro Inc2()
;     Macro Inc2(Length, Value)
;       Data.b Value
;       IncludeData(Length, Value)
;     EndMacro
;   CompilerEndIf  
; EndMacro
;   
; Macro IncludeData(Length, Value)
;   Check(Length)
;   Inc2(Length, Value)
; EndMacro




; klappt nicht
; --------------------------------------------
; Macro Inc2(Length, Value)
;   Data.b Value
;   IncludeData(Length, Value)
; EndMacro
; 
; Macro Check(Length)
;   CompilerIf MacroExpandedCount <= Length
; EndMacro
;   
; Macro IncludeData(Length, Value)
;     Check(Length)
;     Inc2(Length, Value)
;   CompilerEndIf
; EndMacro




; klappt auch nicht 
; --------------------------------------------
; Macro Inc2(Length, Value)
;     Data.b Value
;     IncludeData(Length, Value)
; EndMacro  
; 
; Macro IncludeData(Length, Value)
;   CompilerIf MacroExpandedCount <= Length
;     Inc2(Length, Value)
;   CompilerEndIf
; EndMacro



DataSection
  IncludeData(100, $23)
EndDataSection