Code: Alles auswählen
Structure Typ_ListDatum
StructureUnion
i.i : q.q : l.l : w.w : b.b
u.u : a.a
s.String
EndStructureUnion
EndStructure
Structure Typ_ListElement
*NextElement.Typ_ListElement
*PrevElement.Typ_ListElement
Datum.Typ_ListDatum
EndStructure
Structure Typ_PtrToListElement
*CurrentElement.Typ_ListElement
EndStructure
Structure Typ_ListInfo
*FirstElement.Typ_ListElement
*LastElement.Typ_ListElement
*CurrentElement.Typ_ListElement
*CurrentElementInHeader.Typ_PtrToListElement
ListSize.i
ListIndex.i
EndStructure
Structure Typ_ListHeader
*ListInfo.Typ_ListInfo
*CurrentElement.Typ_ListElement
EndStructure
Zum ermitteln des Zeigers zum "ListHeader" und/oder zur "ListInfo" habe ich mir übrigens folgende Macros gestrickt: (EDIT: Fehler vom Copy&Paste korrigiert)
Code: Alles auswählen
; Initialisierungen
EnableExplicit
EnableASM
#Language = 'de'
CompilerIf #PB_Integer = #PB_Quad
! xax equ rax
! iword equ qword
CompilerElse
! xax equ eax
! iword equ dword
CompilerEndIf
; Hilfs-Macros, welche ich generell gerne verwende.
CompilerSelect #Language
CompilerCase 'en'
Macro Lang(en,de)
en
EndMacro
CompilerCase 'de'
Macro Lang(en,de)
de
EndMacro
CompilerEndSelect
Macro AsStr(Ausdruck)
AsStr_DoubleQuote#Ausdruck#AsStr_DoubleQuote
EndMacro
Macro AsStr_DoubleQuote
"
EndMacro
; Die eigentlichen Macros zum ermitteln der Zeiger
Macro PointerToListHeader(IN_ListName, OUT_Variable, GlobalList=#True)
__PointerToXXX_ParameterCheck(IN_ListName, OUT_Variable)
CompilerIf GlobalList
LEA xax, [t_#IN_ListName]
CompilerElse
LEA xax, [p.t_#IN_ListName]
CompilerEndIf
MOV OUT_Variable, xax
EndMacro
Macro PointerToListInfo(IN_ListName, OUT_Variable, GlobalList=#True)
__PointerToXXX_ParameterCheck(IN_ListName, OUT_Variable)
CompilerIf GlobalList
MOV xax, [t_#IN_ListName]
CompilerElse
MOV xax, [p.t_#IN_ListName]
CompilerEndIf
MOV OUT_Variable, xax
EndMacro
Macro __PointerToXXX_ParameterCheck(IN_ListName, OUT_Variable)
CompilerIf Defined(IN_ListName, #PB_LinkedList) = 0
CompilerError Lang("List has to be defined in advance","Liste muss zuvor definiert worden sein")+": "+AsStr(IN_ListName)+"()"
CompilerEndIf
CompilerIf Defined(OUT_Variable, #PB_Variable) = 0
CompilerError Lang("Variable has to be defined in advance","Variable muss zuvor definiert worden sein")+": "+AsStr(OUT_Variable)
CompilerEndIf
CompilerIf Defined(t_#IN_ListName, #PB_Variable)
CompilerError Lang("Collision between ASM-List name and variable name","Kollision zwischen ASM-Listenname und Variablenname")+": "+AsStr(t_#IN_ListName)
CompilerEndIf
CompilerIf SizeOf(OUT_Variable) < SizeOf(Integer)
CompilerError "SizeOf("+AsStr(OUT_Variable)+") "+Lang("has To be equal or greater than SizeOf(Integer)","muss größer gleich SizeOf(Integer) sein")
CompilerEndIf
EndMacro
EDIT 2: Eine kleine Demo is evtl. nicht schlecht. Die obigen 2 Codes habe ich als "LinkedListStructure.pb" und "LinkedListMacros.pb" per IncludeFile eingebunden.
Code: Alles auswählen
IncludeFile "LinkedListStructure.pb"
IncludeFile "LinkedListMacros.pb"
NewList bla.s()
Define *ListHeader.Typ_ListHeader
Define *ListInfo.Typ_ListInfo
AddElement(bla()) : bla() = "das"
AddElement(bla()) : bla() = "is"
AddElement(bla()) : bla() = "ne"
AddElement(bla()) : bla() = "Demo"
Debug "=== via PointerToListHeader ==="
PointerToListHeader(bla, *ListHeader)
Debug *ListHeader\ListInfo\FirstElement\Datum\s\s
Debug *ListHeader\ListInfo\FirstElement\NextElement\Datum\s\s
Debug *ListHeader\ListInfo\FirstElement\NextElement\NextElement\Datum\s\s
Debug *ListHeader\ListInfo\FirstElement\NextElement\NextElement\NextElement\Datum\s\s
Debug ""
Debug "=== via PointerToListHeader ==="
PointerToListInfo(bla, *ListInfo)
Debug *ListInfo\CurrentElement\PrevElement\Datum\s\s
Debug *ListInfo\CurrentElement\Datum\s\s
Debug *ListInfo\FirstElement\NextElement\Datum\s\s
Debug *ListInfo\FirstElement\Datum\s\s
Debug ""