Rekursive Makros

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Rekursive Makros

Beitrag 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?
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Re: Rekursive Makros

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Rekursive Makros

Beitrag 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.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Rekursive Makros

Beitrag 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. :-) )
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Re: Rekursive Makros

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Rekursive Makros

Beitrag 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...
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Rekursive Makros

Beitrag 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
weil einfach einfach einfach ist ... mach' ich es anders
Antworten