Einfaches Array mit Wertzuweisung

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Einfaches Array mit Wertzuweisung

Beitrag 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:
Zuletzt geändert von mk-soft am 16.05.2016 10:59, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Einfaches Array mit Wertzuweisung

Beitrag 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
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Einfaches Array mit Wertzuweisung

Beitrag 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.
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Einfaches Array mit Wertzuweisung

Beitrag von mk-soft »

Im übrigen würde ich If statt CompilerIf nehmen
Dann wird aber unnötig code erstellt... siehe ASM-Output.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Einfaches Array mit Wertzuweisung

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Einfaches Array mit Wertzuweisung

Beitrag 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.
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Einfaches Array mit Wertzuweisung

Beitrag 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)
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Einfaches Array mit Wertzuweisung

Beitrag 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
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Einfaches Array mit Wertzuweisung

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten