Spielerei: Array-Erstellung per Makro

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
NicTheQuick
Ein Admin
Beiträge: 8812
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

Spielerei: Array-Erstellung per Makro

Beitrag von NicTheQuick »

Dies sind Makros für Arrays. Eigentlich nur eine Spielerei, aber sicherlich
ausbaufähig.
Erstellt werden pro Array eine Struktur und ein Pointer mit der Struktur.
Die Struktur heißt in "Makro-Sprache" arr_#name#_struc und der Pointer
heißt *arr_#name, wobei als name der Name des Array einzusetzen ist.
Fehlerüberprüfungen sind keine eingebaut. Es gibt nur das Makro IsArray,
das den Pointer zur Array-Struktur zurückgibt.

Code: Alles auswählen

;Struktur:  arr_#name#_struc
;Variablen: *arr_#name.arr_#name#_struc

Macro NewArray(name, first, last, Struct)
  Structure arr_#name#_struc
    _first.l
    _last.l
    element.Struct[last - first + 1]
  EndStructure
  Global *arr_#name.arr_#name#_struc
  *arr_#name = AllocateMemory((last - first + 1) * SizeOf(arr_#name#_struc))
  *arr_#name\_first = first
  *arr_#name\_last = last
EndMacro
Macro IsArray(name)
  *arr_#name
EndMacro
Macro Array(name, index)
  *arr_#name\element[index - *arr_#name\_first]
EndMacro
Macro LBound(name)
  *arr_#name\_first
EndMacro
Macro UBound(name)
  *arr_#name\_last
EndMacro
Macro DelArray(name)
  FreeMemory(*arr_#name)
EndMacro

;Array erstellen;
;1. Parameter: Name des Arrays
;2. Parameter: Niedrigster Index
;3. Paremeter: Höchster Index
;4. Parameter: Struktur der Elemente
NewArray(hallo, 50, 150, Point)

;Überprüfen, ob Array erstellt wurde
If IsArray(hallo)
  Debug "Array erstellt"
EndIf

;Array füllen
For a = 50 To 150
  Array(hallo, a)\x = a * 10
  Array(hallo, a)\y = 150 - a
Next

Debug "Anfang: " + Str(LBound(hallo))
Debug "Ende: " + Str(UBound(hallo))

;Array ausgeben
For a = 50 To 150
  Debug Str(Array(hallo, a)\x) + " - " + Str(Array(hallo, a)\y)
Next

;Array wieder löschen (angelegte Variablen bleiben erhalten!)
DelArray(hallo)
Viel Spaß mit der Spielerei.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

gefällt mir. :D

..wollte grad noch die index-angabe optional machen.
klappt aber nur mit long oder quad elementen in der stuct ..weiß nich warum :cry: (macht eh nich viel sinn :roll: )

Code: Alles auswählen

ArrayI(name, index)      ; zugriff auf index
ArrayIset(name, index)   ; standard index setzen
Array(name)              ; zugriff auf standard index

Code: Alles auswählen

Macro NewArray(name, first, last, Struct)
  Structure arr_#name#_struc
    _first.l
    _last.l
    element.Struct[last - first + 1]
  EndStructure
  Global *arr_#name.arr_#name#_struc
  *arr_#name = AllocateMemory((last - first + 1) * SizeOf(arr_#name#_struc))
  *arr_#name\_first = first
  *arr_#name\_last = last
  Global arr_#name#_currentIndex = first ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NEW
EndMacro

Macro ArrayI(name, index)
  *arr_#name\element[index - *arr_#name\_first]
EndMacro

Macro ArrayIset(name, index)
  arr_#name#_currentIndex = index
EndMacro

Macro Array(name)
  *arr_#name\element[arr_#name#_currentIndex - *arr_#name\_first]
EndMacro



Structure myS
  a.l
  b.q
  c.l
  d.b
  e.l
EndStructure
NewArray(hallo, 50, 54, myS)

For i = 50 To 54
  ArrayI(hallo, i)\a  = i*10
  ArrayI(hallo, i)\b  = i*10+1
  ArrayI(hallo, i)\c  = i*10+2
  ArrayI(hallo, i)\d  = i*10+3
  ArrayI(hallo, i)\e  = i*10+4
Next

For i = 50 To 54
  ArrayIset(hallo, i)
  Debug Str( Array(hallo)\a )
  Debug Str( Array(hallo)\b )
  Debug Str( Array(hallo)\c )
  Debug Str( Array(hallo)\d )
  Debug Str( Array(hallo)\e )
  Debug ""
Next

my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
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

Beitrag von NicTheQuick »

Gute Idee! :allright:

Ich hab die current-Variable noch mit in die Struktur genommen und die
Makros Array() und ArrayIset() geändert, sodass pro Aufruf eine Subtraktion
weniger nötig ist.

Code: Alles auswählen

Macro NewArray(Name, first, last, Struct)
  Structure arr_#name#_struc
    _first.l
    _last.l
    _current.l
    element.Struct[last - first + 1]
  EndStructure
  Global *arr_#name.arr_#name#_struc
  *arr_#name = AllocateMemory((last - first + 1) * SizeOf(arr_#name#_struc))
  *arr_#name\_first = first
  *arr_#name\_last = last
  *arr_#name\_current = 0
EndMacro

Macro IsArray(Name)
  *arr_#name
EndMacro

Macro ArrayI(Name, Index)
  *arr_#name\element[Index - *arr_#name\_first]
EndMacro

Macro ArrayIset(Name, Index)
  *arr_#name\_current = Index - *arr_#name\_first
EndMacro

Macro Array(Name)
  *arr_#name\element[*arr_#name\_current]
EndMacro

Macro LBound(Name)
  *arr_#name\_first
EndMacro
Macro UBound(Name)
  *arr_#name\_last
EndMacro
Macro DelArray(Name)
  FreeMemory(*arr_#name)
EndMacro 



Structure myS
  a.l
  b.q
  c.l
  d.b
  e.l
EndStructure
NewArray(hallo, 50, 54, myS)

For i = 50 To 54
  ArrayI(hallo, i)\a  = i*10
  ArrayI(hallo, i)\b  = i*10+1
  ArrayI(hallo, i)\c  = i*10+2
  ArrayI(hallo, i)\d  = i*10+3
  ArrayI(hallo, i)\e  = i*10+4
Next

For i = 50 To 54
  ArrayIset(hallo, i)
  Debug Str( Array(hallo)\a )
  Debug Str( Array(hallo)\b )
  Debug Str( Array(hallo)\c )
  Debug Str( Array(hallo)\d )
  Debug Str( Array(hallo)\e )
  Debug ""
Next 
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Hey, die Idee ist einfach- aber interessant :allright:
*Gleich mal nachmach* <)
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Antworten