Declare Array inline

Share your advanced PureBasic knowledge/code with the community.
Rinzwind
Enthusiast
Enthusiast
Posts: 638
Joined: Wed Mar 11, 2009 4:06 pm
Location: NL

Declare Array inline

Post by Rinzwind »

As long as Fred refuses to implement instant Array initialization (also very useful for passing one-off arrays to functions (which this macro can not solve))... :twisted:

here's one way to get it a similar effect for 1-dimensional arrays for up to 16 values.
Variable parameters would be welcome too for macro's. MacroParamCount? MacroParam(x)? More logic. Because, well.. that's what macro's are for. Automating repetitive stuff...

Code: Select all

EnableExplicit

Macro MacroQuote
  "
EndMacro

Macro Array(name, type, i1=, i2=, i3=, i4=, i5=, i6=, i7=, i8=, i9=, i10=, i11=, i12=, i13=, i14=, i15=, i16=)
  CompilerIf MacroQuote#i16#MacroQuote <> ""
    #ArraySize#name = 15
  CompilerElseIf MacroQuote#i15#MacroQuote <> ""
    #ArraySize#name = 14
  CompilerElseIf MacroQuote#i14#MacroQuote <> ""
    #ArraySize#name = 13
  CompilerElseIf MacroQuote#i13#MacroQuote <> ""
    #ArraySize#name = 12
  CompilerElseIf MacroQuote#i12#MacroQuote <> ""
    #ArraySize#name = 11
  CompilerElseIf MacroQuote#i11#MacroQuote <> ""
    #ArraySize#name = 10
  CompilerElseIf MacroQuote#i10#MacroQuote <> ""
    #ArraySize#name = 9
  CompilerElseIf MacroQuote#i9#MacroQuote <> ""
    #ArraySize#name = 8
  CompilerElseIf MacroQuote#i8#MacroQuote <> ""
    #ArraySize#name = 7
  CompilerElseIf MacroQuote#i7#MacroQuote <> ""
    #ArraySize#name = 6
  CompilerElseIf MacroQuote#i6#MacroQuote <> ""
    #ArraySize#name = 5
  CompilerElseIf MacroQuote#i5#MacroQuote <> ""
    #ArraySize#name = 4
  CompilerElseIf MacroQuote#i4#MacroQuote <> ""
    #ArraySize#name = 3    
  CompilerElseIf MacroQuote#i3#MacroQuote <> ""
    #ArraySize#name = 2
  CompilerElseIf MacroQuote#i2#MacroQuote <> ""
    #ArraySize#name = 1
  CompilerElseIf MacroQuote#i1#MacroQuote <> ""
    #ArraySize#name = 0
  CompilerElse
    #ArraySize#name = 0
  CompilerEndIf

  CompilerIf MacroQuote#type#MacroQuote = ".sl"
    Dim name.s(#ArraySize#name)
    CompilerIf MacroQuote#i16#MacroQuote <> "": name(15) = MacroQuote#i16#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i15#MacroQuote <> "": name(14) = MacroQuote#i15#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i14#MacroQuote <> "": name(13) = MacroQuote#i14#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i13#MacroQuote <> "": name(12) = MacroQuote#i13#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i12#MacroQuote <> "": name(11) = MacroQuote#i12#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i11#MacroQuote <> "": name(10) = MacroQuote#i11#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i10#MacroQuote <> "": name(9) = MacroQuote#i10#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i9#MacroQuote <> "": name(8) = MacroQuote#i9#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i8#MacroQuote <> "": name(7) = MacroQuote#i8#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i7#MacroQuote <> "": name(6) = MacroQuote#i7#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i6#MacroQuote <> "": name(5) = MacroQuote#i6#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i5#MacroQuote <> "": name(4) = MacroQuote#i5#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i4#MacroQuote <> "": name(3) = MacroQuote#i4#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i3#MacroQuote <> "": name(2) = MacroQuote#i3#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i2#MacroQuote <> "": name(1) = MacroQuote#i2#MacroQuote#: CompilerEndIf
    CompilerIf MacroQuote#i1#MacroQuote <> "": name(0) = MacroQuote#i1#MacroQuote#: CompilerEndIf      
  CompilerElse
    Dim name#type(#ArraySize#name)
    CompilerIf MacroQuote#i16#MacroQuote <> "": name(15) = i16: CompilerEndIf
    CompilerIf MacroQuote#i15#MacroQuote <> "": name(14) = i15: CompilerEndIf
    CompilerIf MacroQuote#i14#MacroQuote <> "": name(13) = i14: CompilerEndIf
    CompilerIf MacroQuote#i13#MacroQuote <> "": name(12) = i13: CompilerEndIf
    CompilerIf MacroQuote#i12#MacroQuote <> "": name(11) = i12: CompilerEndIf
    CompilerIf MacroQuote#i11#MacroQuote <> "": name(10) = i11: CompilerEndIf
    CompilerIf MacroQuote#i10#MacroQuote <> "": name(9) = i10: CompilerEndIf
    CompilerIf MacroQuote#i9#MacroQuote <> "": name(8) = i9: CompilerEndIf
    CompilerIf MacroQuote#i8#MacroQuote <> "": name(7) = i8: CompilerEndIf
    CompilerIf MacroQuote#i7#MacroQuote <> "": name(6) = i7: CompilerEndIf
    CompilerIf MacroQuote#i6#MacroQuote <> "": name(5) = i6: CompilerEndIf
    CompilerIf MacroQuote#i5#MacroQuote <> "": name(4) = i5: CompilerEndIf
    CompilerIf MacroQuote#i4#MacroQuote <> "": name(3) = i4: CompilerEndIf
    CompilerIf MacroQuote#i3#MacroQuote <> "": name(2) = i3: CompilerEndIf
    CompilerIf MacroQuote#i2#MacroQuote <> "": name(1) = i2: CompilerEndIf
    CompilerIf MacroQuote#i1#MacroQuote <> "": name(0) = i1: CompilerEndIf    
  CompilerEndIf
EndMacro

Array(test1, .i, 1, 2, 3, 4) ;Same result as writing manually all array composition stuff
Array(test2, .sl, a, b, c, d)
Define i
For i = 0 To ArraySize(test1())
  Debug test1(i)  
Next
For i = 0 To ArraySize(test2())
  Debug test2(i)  
Next
String literal (here named .sl) is a bit messy... anyone other options?