Seite 1 von 1

Spielerei: Array-Erstellung per Makro

Verfasst: 12.12.2006 17:34
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.

Verfasst: 12.12.2006 18:49
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


Verfasst: 12.12.2006 20:07
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 

Verfasst: 13.12.2006 11:04
von Tafkadasom2k5
Hey, die Idee ist einfach- aber interessant :allright:
*Gleich mal nachmach* <)