Seite 1 von 1

Einfaches Array mit Wertzuweisung

Verfasst: 13.05.2016 21:34
von mk-soft
Hi,

habe mal Arrays gespielt.

Update v1.02

Code: Alles auswählen

;-Begin

; Comment: Macros for Arrays
; Author : mk-soft
; Version: v1.02
; Created: 13.05.2016
; Updated: 
; Link   : 

; ***************************************************************************************

Macro CreateArray(name, size, v0=0, v1=0, v2=0, v3=0, v4=0, v5=0, v6=0, v7=0, v8=0, v9=0, v10=0, v11=0, v12=0, v13=0, v14=0, v15=0, v16=0, v17=0, v18=0, v19=0)
  Dim name(size-1)
  CompilerIf size > 0 : name(0) = v0 : CompilerEndIf
  CompilerIf size > 1 : name(1) = v1 : CompilerEndIf
  CompilerIf size > 2 : name(2) = v2 : CompilerEndIf
  CompilerIf size > 3 : name(3) = v3 : CompilerEndIf
  CompilerIf size > 4 : name(4) = v4 : CompilerEndIf
  CompilerIf size > 5 : name(5) = v5 : CompilerEndIf
  CompilerIf size > 6 : name(6) = v6 : CompilerEndIf
  CompilerIf size > 7 : name(7) = v7 : CompilerEndIf
  CompilerIf size > 8 : name(8) = v8 : CompilerEndIf
  CompilerIf size > 9 : name(9) = v9 : CompilerEndIf
  CompilerIf size > 10 : name(10) = v10 : CompilerEndIf
  CompilerIf size > 11 : name(11) = v11 : CompilerEndIf
  CompilerIf size > 12 : name(12) = v12 : CompilerEndIf
  CompilerIf size > 13 : name(13) = v13 : CompilerEndIf
  CompilerIf size > 14 : name(14) = v14 : CompilerEndIf
  CompilerIf size > 15 : name(15) = v15 : CompilerEndIf
  CompilerIf size > 16 : name(16) = v16 : CompilerEndIf
  CompilerIf size > 17 : name(17) = v17 : CompilerEndIf
  CompilerIf size > 18 : name(18) = v18 : CompilerEndIf
  CompilerIf size > 19 : name(19) = v19 : CompilerEndIf
EndMacro

Macro CreateStringArray(name, size, s0="", s1="", s2="", s3="", s4="", s5="", s6="", s7="", s8="", s9="", s10="", s11="", s12="", s13="", s14="", s15="", s16="", s17="", s18="", s19="")
  Dim name.s(size-1)
  CompilerIf size > 0 : name(0) = s0 : CompilerEndIf
  CompilerIf size > 1 : name(1) = s1 : CompilerEndIf
  CompilerIf size > 2 : name(2) = s2 : CompilerEndIf
  CompilerIf size > 3 : name(3) = s3 : CompilerEndIf
  CompilerIf size > 4 : name(4) = s4 : CompilerEndIf
  CompilerIf size > 5 : name(5) = s5 : CompilerEndIf
  CompilerIf size > 6 : name(6) = s6 : CompilerEndIf
  CompilerIf size > 7 : name(7) = s7 : CompilerEndIf
  CompilerIf size > 8 : name(8) = s8 : CompilerEndIf
  CompilerIf size > 9 : name(9) = s9 : CompilerEndIf
  CompilerIf size > 10 : name(10) = s10 : CompilerEndIf
  CompilerIf size > 11 : name(11) = s11 : CompilerEndIf
  CompilerIf size > 12 : name(12) = s12 : CompilerEndIf
  CompilerIf size > 13 : name(13) = s13 : CompilerEndIf
  CompilerIf size > 14 : name(14) = s14 : CompilerEndIf
  CompilerIf size > 15 : name(15) = s15 : CompilerEndIf
  CompilerIf size > 16 : name(16) = s16 : CompilerEndIf
  CompilerIf size > 17 : name(17) = s17 : CompilerEndIf
  CompilerIf size > 18 : name(18) = s18 : CompilerEndIf
  CompilerIf size > 19 : name(19) = s19 : CompilerEndIf
EndMacro

; ***************************************************************************************

CompilerIf #PB_Compiler_IsMainFile
  Debug "Array Of Numbers"
  Global CreateArray(daten.f, 3, 200.6, 300.3, 99.1)
  
  Define index
  For index = 0 To ArraySize(Daten())
    Debug daten(index)
  Next
  
  Debug "Array Of String"
  Global CreateStringArray(Wochentag, 7, "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag")
  Define index
  For index = 0 To ArraySize(Wochentag())
    Debug Wochentag(index)
  Next
  
CompilerEndIf
:wink:

P.S. Jetzt auch mit String :allriggt:

Re: Einfaches Array mit Wertzuweisung

Verfasst: 14.05.2016 08:13
von mhs
Was hältst du denn davon?

Code: Alles auswählen

Macro DimV(name, size, v0=0, v1=0, v2=0, v3=0, v4=0, v5=0, v6=0, v7=0, v8=0, v9=0, v10=0, v11=0, v12=0, v13=0, v14=0, v15=0, v16=0, v17=0, v18=0, v19=0)

  Dim name(size - 1)
 
  CompilerIf size >  0 : name(0)  = v0  : CompilerEndIf
  CompilerIf size >  1 : name(1)  = v1  : CompilerEndIf
  CompilerIf size >  2 : name(2)  = v2  : CompilerEndIf
  CompilerIf size >  3 : name(3)  = v3  : CompilerEndIf
  CompilerIf size >  4 : name(4)  = v4  : CompilerEndIf
  CompilerIf size >  5 : name(5)  = v5  : CompilerEndIf
  CompilerIf size >  6 : name(6)  = v6  : CompilerEndIf
  CompilerIf size >  7 : name(7)  = v7  : CompilerEndIf
  CompilerIf size >  8 : name(8)  = v8  : CompilerEndIf
  CompilerIf size >  9 : name(9)  = v9  : CompilerEndIf
  CompilerIf size > 10 : name(10) = v10 : CompilerEndIf
  CompilerIf size > 11 : name(11) = v11 : CompilerEndIf
  CompilerIf size > 12 : name(12) = v12 : CompilerEndIf
  CompilerIf size > 13 : name(13) = v13 : CompilerEndIf
  CompilerIf size > 14 : name(14) = v14 : CompilerEndIf
  CompilerIf size > 15 : name(15) = v15 : CompilerEndIf
  CompilerIf size > 16 : name(16) = v16 : CompilerEndIf
  CompilerIf size > 17 : name(17) = v17 : CompilerEndIf
  CompilerIf size > 18 : name(18) = v18 : CompilerEndIf
  CompilerIf size > 19 : name(19) = v19 : CompilerEndIf
 
EndMacro


; ***************************************************************************************

CompilerIf #PB_Compiler_IsMainFile
  Debug "Array Of Numbers"
  Global DimV(daten.f, 3, 200.6, 300.3, 99.1)
 
  Define index
  For index = 0 To ArraySize(Daten())
    Debug daten(index)
  Next
 
  Debug "Array Of String"
  Global DimV(Wochentag.s, 7, "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag")
  Define index
  For index = 0 To ArraySize(Wochentag())
    Debug Wochentag(index)
  Next
CompilerEndIf

Re: Einfaches Array mit Wertzuweisung

Verfasst: 14.05.2016 13:38
von Nino

Code: Alles auswählen

Macro DimS(name, size, s0="", s1="", s2="", s3="", s4="", s5="", s6="", s7="", s8="", s9="", s10="", s11="", s12="", s13="", s14="", s15="", s16="", s17="", s18="", s19="")
  Dim name.s(size)
  CompilerIf Bool(s0<>"") : name(0) = s0 : CompilerEndIf
  CompilerIf Bool(s1<>"") : name(1) = s1 : CompilerEndIf
  CompilerIf Bool(s2<>"") : name(2) = s2 : CompilerEndIf
  CompilerIf Bool(s3<>"") : name(3) = s3 : CompilerEndIf
  CompilerIf Bool(s4<>"") : name(4) = s4 : CompilerEndIf
  CompilerIf Bool(s5<>"") : name(5) = s5 : CompilerEndIf
  CompilerIf Bool(s6<>"") : name(6) = s6 : CompilerEndIf
  CompilerIf Bool(s7<>"") : name(7) = s7 : CompilerEndIf
  CompilerIf Bool(s8<>"") : name(8) = s8 : CompilerEndIf
  CompilerIf Bool(s9<>"") : name(9) = s9 : CompilerEndIf
  CompilerIf Bool(s10<>"") : name(10) = s10 : CompilerEndIf
  CompilerIf Bool(s11<>"") : name(11) = s11 : CompilerEndIf
  CompilerIf Bool(s12<>"") : name(12) = s12 : CompilerEndIf
  CompilerIf Bool(s13<>"") : name(13) = s13 : CompilerEndIf
  CompilerIf Bool(s14<>"") : name(14) = s14 : CompilerEndIf
  CompilerIf Bool(s15<>"") : name(15) = s15 : CompilerEndIf
  CompilerIf Bool(s16<>"") : name(16) = s16 : CompilerEndIf
  CompilerIf Bool(s17<>"") : name(17) = s17 : CompilerEndIf
  CompilerIf Bool(s18<>"") : name(18) = s18 : CompilerEndIf
  CompilerIf Bool(s19<>"") : name(19) = s19 : CompilerEndIf
EndMacro
Soweit ich sehe ist die Verwendung von Bool() hier nicht erforderlich.
Ich persönlich finde allerdings die Methode von mhs sowieso eleganter. :-)
Im übrigen würde ich If statt CompilerIf nehmen, dann funktioniert das Ganze auch wenn sich die Argumente bzw. deren Anzahl während der Laufzeit ändern.

Re: Einfaches Array mit Wertzuweisung

Verfasst: 14.05.2016 13:47
von mk-soft
Im übrigen würde ich If statt CompilerIf nehmen
Dann wird aber unnötig code erstellt... siehe ASM-Output.

Re: Einfaches Array mit Wertzuweisung

Verfasst: 14.05.2016 15:18
von Sicro
Ich würde den Macro-Name von "DimV" (V=Value?) in "CreateArray" umbenennen, weil der mehr über die Funktion aussagt.
Nino hat geschrieben:Im übrigen würde ich If statt CompilerIf nehmen, dann funktioniert das Ganze auch wenn sich die Argumente bzw. deren Anzahl während der Laufzeit ändern.
Das funktioniert doch so auch schon:

Code: Alles auswählen

Macro CreateArray(name, size, v0=0, v1=0, v2=0, v3=0, v4=0, v5=0, v6=0, v7=0, v8=0, v9=0, v10=0, v11=0, v12=0, v13=0, v14=0, v15=0, v16=0, v17=0, v18=0, v19=0)
  
  Dim name(size - 1)
  
  CompilerIf size >  0 : name(offset + 0)  = v0  : CompilerEndIf
  CompilerIf size >  1 : name(offset + 1)  = v1  : CompilerEndIf
  CompilerIf size >  2 : name(offset + 2)  = v2  : CompilerEndIf
  CompilerIf size >  3 : name(offset + 3)  = v3  : CompilerEndIf
  CompilerIf size >  4 : name(offset + 4)  = v4  : CompilerEndIf
  CompilerIf size >  5 : name(offset + 5)  = v5  : CompilerEndIf
  CompilerIf size >  6 : name(offset + 6)  = v6  : CompilerEndIf
  CompilerIf size >  7 : name(offset + 7)  = v7  : CompilerEndIf
  CompilerIf size >  8 : name(offset + 8)  = v8  : CompilerEndIf
  CompilerIf size >  9 : name(offset + 9)  = v9  : CompilerEndIf
  CompilerIf size > 10 : name(offset + 10) = v10 : CompilerEndIf
  CompilerIf size > 11 : name(offset + 11) = v11 : CompilerEndIf
  CompilerIf size > 12 : name(offset + 12) = v12 : CompilerEndIf
  CompilerIf size > 13 : name(offset + 13) = v13 : CompilerEndIf
  CompilerIf size > 14 : name(offset + 14) = v14 : CompilerEndIf
  CompilerIf size > 15 : name(offset + 15) = v15 : CompilerEndIf
  CompilerIf size > 16 : name(offset + 16) = v16 : CompilerEndIf
  CompilerIf size > 17 : name(offset + 17) = v17 : CompilerEndIf
  CompilerIf size > 18 : name(offset + 18) = v18 : CompilerEndIf
  CompilerIf size > 19 : name(offset + 19) = v19 : CompilerEndIf
  
EndMacro

; ***************************************************************************************

CompilerIf #PB_Compiler_IsMainFile
  
  Global CreateArray(Wochentag.s, 7, "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag")
  CountOfItems = ArraySize(Wochentag())
  For i = 0 To CountOfItems
    Debug Wochentag(i)
  Next
  
  Debug "---------------------"
  
  Global CreateArray(Wochentag.s, 2, "Samstag", "Sonntag")
  CountOfItems = ArraySize(Wochentag())
  For i = 0 To CountOfItems
    Debug Wochentag(i)
  Next
  
CompilerEndIf
Die CompilerIfs werden ja im Macro nicht aufgelöst, sondern der ganze Inhalt des Macros wird an die Stellen kopiert, wo das Macro "aufgerufen" wird.

Re: Einfaches Array mit Wertzuweisung

Verfasst: 14.05.2016 16:23
von Nino
Nino hat geschrieben:Im übrigen würde ich If statt CompilerIf nehmen, dann funktioniert das Ganze auch wenn sich die Argumente bzw. deren Anzahl während der Laufzeit ändern.
mk-soft hat geschrieben:Dann wird aber unnötig code erstellt... siehe ASM-Output.
Wenn sich die Argumente bzw. deren Anzahl während der Laufzeit nicht ändern, dann ist der zusätzlich erzeugte Code tatsächlich unnötig. Wenn sich das aber zur Laufzeit ändert oder ändern kann, dann ist der zusätzlich erzeugte Code nicht unnötig, sondern erforderlich.
Wenn Du also hier die Code-Größe optimieren willst, dann brauchst Du je nach Bedarf verschiedene Makros. Ich ziehe es bei solchen Dingen vor, möglichst wenige vielseitig verwendbare Makros/Prozeduren zu haben und störe mich nicht daran, wenn dadurch das Programm ein paar KB größer wird. Daher hatte ich das geschrieben.
Sicro hat geschrieben:
Nino hat geschrieben:Im übrigen würde ich If statt CompilerIf nehmen, dann funktioniert das Ganze auch wenn sich die Argumente bzw. deren Anzahl während der Laufzeit ändern.
Das funktioniert doch so auch schon:
[...]
Die CompilerIfs werden ja im Macro nicht aufgelöst, sondern der ganze Inhalt des Macros wird an die Stellen kopiert, wo das Macro "aufgerufen" wird.
Ob mit oder ohne Makro: CompilerIf wird immer zur Compilierzeit ausgewertet, und nicht zur Laufzeit.

Re: Einfaches Array mit Wertzuweisung

Verfasst: 14.05.2016 17:23
von mhs
CompilerIf ist an der Stelle schon richtig. Ich hab das so verstanden, dass mk-soft damit eine "variable Argumentenliste" erzeugen möchte. Und die steht bereits zum Zeitpunkt des Kompilierens fest, je nachdem wieviele Parameter der Programmierer beim Aufruf angegeben hat.

Es kann ja auch mal ein Array Element eine 0 beinhalten...

Code: Alles auswählen

DimV(daten.i, 5, 10, 20, 0, 25, 30)

Re: Einfaches Array mit Wertzuweisung

Verfasst: 14.05.2016 17:47
von Sicro
Nino hat geschrieben:Ob mit oder ohne Makro: CompilerIf wird immer zur Compilierzeit ausgewertet, und nicht zur Laufzeit.
Ja, richtig. Ich dachte, du meinst was anderes.

Das meinst du?

Code: Alles auswählen

Macro DimVs(name, size, v0="", v1="", v2="", v3="", v4="", v5="", v6="", v7="", v8="", v9="", v10="", v11="", v12="", v13="", v14="", v15="", v16="", v17="", v18="", v19="")

  Dim name(size - 1)
 
  If size >  0 : name(0)  = v0  : EndIf
  If size >  1 : name(1)  = v1  : EndIf
  If size >  2 : name(2)  = v2  : EndIf
  If size >  3 : name(3)  = v3  : EndIf
  If size >  4 : name(4)  = v4  : EndIf
  If size >  5 : name(5)  = v5  : EndIf
  If size >  6 : name(6)  = v6  : EndIf
  If size >  7 : name(7)  = v7  : EndIf
  If size >  8 : name(8)  = v8  : EndIf
  If size >  9 : name(9)  = v9  : EndIf
  If size > 10 : name(10) = v10 : EndIf
  If size > 11 : name(11) = v11 : EndIf
  If size > 12 : name(12) = v12 : EndIf
  If size > 13 : name(13) = v13 : EndIf
  If size > 14 : name(14) = v14 : EndIf
  If size > 15 : name(15) = v15 : EndIf
  If size > 16 : name(16) = v16 : EndIf
  If size > 17 : name(17) = v17 : EndIf
  If size > 18 : name(18) = v18 : EndIf
  If size > 19 : name(19) = v19 : EndIf
 
EndMacro

; ***************************************************************************************

If #PB_Compiler_IsMainFile
  
  Result = Val(InputRequester("", "", "1"))
  DimVs(Wochentag.s, Result, "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag")
    
  CountOfItems = ArraySize(Wochentag())
  For i = 0 To CountOfItems
    Debug Wochentag(i)
  Next
  
EndIf

Re: Einfaches Array mit Wertzuweisung

Verfasst: 16.05.2016 11:07
von mk-soft
Den Namen "CreateArray" finde ich auch besser. Für Strings immer noch ein eigenes Macro da wenn man nicht alle Elemente angibt es sonst zu einen Fehler führt.
Size ist jetzt auch die Anzahl und nicht mehr das letzte Element.

Auch immer noch "CompilerIF" da zur Zeit des kompilieren die Elemente als Startwert zugewiesen werden soll.

Wer mehr Parameter benötigt, kann ja den Macro entsprechend erweitern.

:wink: