Seite 2 von 2
Re: Anzahl der Felder in einer Structure ermitteln
Verfasst: 03.07.2020 15:45
von Olafmagne
@NicTheQuick
wow!!!!
gerade wollte ich alles abblasen,weil ich nicht wusste,wie ich eine list ohne Structname übergebe.
Deine Lösung ist da genau das was ich brauche.
Ich hatte zwar auch schon mit Macro angefangen,aber einen "UniType",da bin ich nicht drauf gekommen!
Damit,und dem,was ich bis jetzt gebastelt habe,sollte eine Art CarbageCollector für Doubletten/'tote' Objecte/...
kein Problem sein
Merci an alle
Olaf
Re: Anzahl der Felder in einer Structure ermitteln
Verfasst: 03.07.2020 16:33
von Olafmagne
@NicTheQuick
Wenn ich das richtig sehe,wird die 'Various'Structure nur gebraucht,um das Alignment einzustellen,
was,abhängig des Processors entweder 4 oder 8 ergibt.
Das könnte ich dass auch mit einer Compiler-Anweisung erledigen?
Code: Alles auswählen
CompilerIf #PB_Compiler_Processor =#PB_Processor_x86
#algn=4
CompilerElseIf #PB_Compiler_Processor =#PB_Processor_x64
#algn=8
CompilerEndIf
Olaf
EDIT: sorry,hab meinen Irrtum Erkannt(VariousList())
Re: Anzahl der Felder in einer Structure ermitteln
Verfasst: 03.07.2020 17:24
von NicTheQuick
Je nachdem, was du genau brauchst, kann man das natürlich deutlich vereinfachen. Ich wollte dir nur etwas basteln, was alle Möglichkeiten abdeckt.
Re: Anzahl der Felder in einer Structure ermitteln
Verfasst: 03.07.2020 18:40
von Olafmagne
NicTheQuick hat geschrieben:Je nachdem, was du genau brauchst, kann man das natürlich deutlich vereinfachen. Ich wollte dir nur etwas basteln, was alle Möglichkeiten abdeckt.
Genauso hab ich das auch gesehen,und bereits einige anpassungen vorgenommen
Das übergeben der List ohne den Type zu kennen war mein letztes Problem,das du ja
Gelöst hast.
Align,je nach System 4/8 Byte
Code: Alles auswählen
Structure VariousListInclude
_nbfld.i ;Anzahl der einträge!
_any.VariousList
EndStructure
Und mit algn*(1...nbfld) habe ich den Offsetof() jeden Aintrages
Der Feldtype intressiert mich hier nicht,nur die RawData der MemoryCell wird zum Vergleich herrangezogen.
Danke nochmal
Olaf
Re: Anzahl der Felder in einer Structure ermitteln
Verfasst: 04.07.2020 13:10
von Olafmagne
Hallo
Ähm , hat sich gerade erledigt.
Sobald ich die Frage sah,sah ich auch die Antwort
Olaf
Re: Anzahl der Felder in einer Structure ermitteln
Verfasst: 04.07.2020 15:00
von Olafmagne
Hallo,
So,jetzt habe ich das Ganze noch um eine Procedure und ein paar Daten erweitert.
Die Procedure
compStruc(*var.VariousListInclude) ist die benötigte Function
Code: Alles auswählen
EnableExplicit
; setzen des Align-Wertes,jenach Processor
CompilerIf #PB_Compiler_Processor =#PB_Processor_x86
#algn=4
CompilerElseIf #PB_Compiler_Processor =#PB_Processor_x64
#algn=8
CompilerEndIf
; Structure von >NicTheQuic>
Structure Various
StructureUnion
a.a
b.b
c.c
d.d
f.f
i.i
l.l
q.q
*s ;zeiger auf String$
u.u
w.w
EndStructureUnion
EndStructure
Structure VariousList
f.Various[0]
EndStructure
Structure VariousListInclude
*_structname ;Structure-Name
_sze.i ;Grösse
_strcnt.i ;Anzahl Felder
_any.VariousList ;
EndStructure
; Macro zum Erstellen der 'Universal-Structure' von >NicTheQuick<
Macro StructureList(name)
Structure name Extends VariousListInclude Align SizeOf(Various)
EndMacro
; ein paar String$ zum Testen
Define dat$="c:\user\Ich\Game\Sprites\Hcaracter.bld",das$="c:\user\Ich\Game\Sprites\Wcaracter.bld"
Define nme$="Held"
; Und die Neue Structure
StructureList(AnimSprite)
*Datei
*Name
Anzahl.i
x.i
y.i
xff.i
yff.i
srtpnt.i
lng.i
frame.i
xmve.i
ymve.i
EndStructure
; Zwei Structure-Namen zum Testen
Define strctnme$="AnimSprite",keinnme$="nix"
;*****Procedure zum zugriff auf die StructureElemente******
; Dank an Ihr wisst schon <NicTheQuick>
Procedure showStruc(*var.VariousListInclude)
Debug "*** Show ***"
Debug PeekS(*var\_structname)
Debug *var\_sze
Debug *var\_strcnt
Debug PeekS(*var\_any\f[0]\s)
Debug PeekS(*var\_any\f[1]\s)
Debug *var\_any\f[2]\i
Debug *var\_any\f[3]\i
Debug *var\_any\f[4]\i
Debug *var\_any\f[5]\i
Debug *var\_any\f[6]\i
Debug *var\_any\f[7]\i
Debug *var\_any\f[8]\i
Debug *var\_any\f[9]\i
Debug *var\_any\f[10]\i
Debug *var\_any\f[11]\i
Debug"*/*/*/*/*/*/*/*/*/*"
EndProcedure
; lese-routiene
Procedure getStrucValue(*var.VariousListInclude,Array zwMem(2),ps)
Debug "/// Compaire ///"
Protected sz,i
sz=*var\_sze ;StructureGrösse
Debug PeekS(*var\_structname)
For i=0 To *var\_strcnt-1
Debug " "+i+" = "+PeekI(*var+(i*8)) ;gelesener Wert als integer
zwMem(i,ps)=PeekI(*var+(i*8)) ;gespeichert im Array
Next i
Debug "/*/*/*/*/*/*/*/*/"
EndProcedure
; Vergleichs-routiene
Procedure compStruct(*vara.VariousListInclude,*varb.VariousListInclude)
Protected Dim zwMem(*vara\_strcnt,2) ;Array zum speichern der werte
Protected i
getStrucValue(*vara.VariousListInclude,zwMem(),1) ;auslesen
getStrucValue(*varb.VariousListInclude,zwMem(),2)
Debug "+++---+++"
For i=0 To *vara\_strcnt-1
If zwMem(i,1)=zwMem(i,2) ;vergleich der zwei Werte
zwMem(i,0)=1 ; 1 wenn gleich
Else
zwMem(i,0)=0 ; 0 wenn ungleich
EndIf
Debug "index="+i+" wert="+zwMem(i,0) ;und anzeigen
Next i
EndProcedure
;zwei Variable.Structure zum Testen
Define Player1.AnimSprite
Player1\_structname=@strctnme$
Player1\_sze=SizeOf(AnimSprite)
Player1\_strcnt=15
Player1\Datei=@dat$
Player1\Name=@nme$
Player1\Anzahl=1
Player1\x=50
Player1\y=100
Player1\xff=400
Player1\yff=200
Player1\srtpnt=7
Player1\lng=6
Player1\frame=4
Player1\xmve=2
Player1\ymve=1
Define Player2.AnimSprite
Player2\_structname=@keinnme$
Player2\_sze=SizeOf(AnimSprite)
Player2\_strcnt=15
Player2\Datei=@das$
Player2\Name=@nme$
Player2\Anzahl=1
Player2\x=50
Player2\y=100
Player2\xff=400
Player2\yff=200
Player2\srtpnt=7
Player2\lng=6
Player2\frame=4
Player2\xmve=1
Player2\ymve=2
showStruc(Player1) ;zeige die Werte
showStruc(Player2)
compStruct(Player1,Player2) ;Vergleiche,und zeige resultat
>:EDIT
Hab den Code aktualisiert,basiert aber immer noch stark auf @NicTheQuick's code,
wird aber später noch erledigt!
Dank noochmal an alle
besonders @NicTheQuick
Olaf
Re: Anzahl der Felder in einer Structure ermitteln
Verfasst: 05.07.2020 14:02
von Olafmagne
Hallo
hier noch mal den Code mit einer weiteren Routine,die Zwei Variable/ListElemente
vergleicht und den Integerwert jedes Feldes in ein Array(1/2) schreibt
für jedes Feld 1(=) oder 0(<>) in Array(0).
Somit ist sowohl ein vergleich auf Feldebene als auch Elementebene Möglich.
Wie das Ergebniss behandelt wird,kann dann je nach Anwendung gewählt werden
Code: Alles auswählen
EnableExplicit
; setzen des Align-Wertes,jenach Processor
CompilerIf #PB_Compiler_Processor =#PB_Processor_x86
#algn=4
CompilerElseIf #PB_Compiler_Processor =#PB_Processor_x64
#algn=8
CompilerEndIf
Enumeration
#OG_Compaire_NotEqual
#OG_Compaire_Equal
EndEnumeration
; Structure von >NicTheQuic>
Structure Various
StructureUnion
a.a
b.b
c.c
d.d
f.f
i.i
l.l
q.q
*s ;zeiger auf String$
u.u
w.w
EndStructureUnion
EndStructure
Structure VariousList
f.Various[0]
EndStructure
Structure VariousListInclude
*_structname ;Structure-Name
_sze.i ;Grösse
_strcnt.i ;Anzahl Felder
_any.VariousList ;
EndStructure
; Macro zum Erstellen der 'Universal-Structure' von >NicTheQuick<
Macro StructureList(name)
Structure name Extends VariousListInclude Align SizeOf(Various)
EndMacro
; ein paar String$ zum Testen
Define dat$="c:\user\Ich\Game\Sprites\Hcaracter.bld",das$="c:\user\Ich\Game\Sprites\Wcaracter.bld"
Define nme$="Held"
; Und die Neue Structure
StructureList(AnimSprite)
*Datei
*Name
Anzahl.i
x.i
y.i
xff.i
yff.i
srtpnt.i
lng.i
frame.i
xmve.i
ymve.i
EndStructure
; Zwei Structure-Namen zum Testen
Define strctnme$="AnimSprite",keinnme$="nix"
;*****Procedure zum zugriff auf die StructureElemente******
; Dank an Ihr wisst schon <NicTheQuick>
Procedure showStruc(*var.VariousListInclude)
Debug "*** Show ***"
Debug PeekS(*var\_structname)
Debug *var\_sze
Debug *var\_strcnt
Debug PeekS(*var\_any\f[0]\s)
Debug PeekS(*var\_any\f[1]\s)
Debug *var\_any\f[2]\i
Debug *var\_any\f[3]\i
Debug *var\_any\f[4]\i
Debug *var\_any\f[5]\i
Debug *var\_any\f[6]\i
Debug *var\_any\f[7]\i
Debug *var\_any\f[8]\i
Debug *var\_any\f[9]\i
Debug *var\_any\f[10]\i
Debug *var\_any\f[11]\i
Debug"*/*/*/*/*/*/*/*/*/*"
EndProcedure
; lese-routiene
Procedure getStrucValue(*var.VariousListInclude,Array zwMem(2),ps)
Debug "/// Compaire FeldInhalt als Integer///"
Protected sz,i
sz=*var\_sze ;StructureGrösse
Debug PeekS(*var\_structname)
For i=0 To *var\_strcnt-1
Debug " "+i+" = "+PeekI(*var+(i*8)) ;gelesener Wert als integer
zwMem(i,ps)=PeekI(*var+(i*8)) ;gespeichert im Array
Next i
Debug "/*/*/*/*/*/*/*/*/"
EndProcedure
; Vergleichs-routiene
Procedure.i compStruct(*vara.VariousListInclude,*varb.VariousListInclude,flag=#OG_Compaire_Equal)
Protected Dim zwMem(*vara\_strcnt,2) ;Array zum speichern der werte
Protected i,result0=0,result=0
getStrucValue(*vara.VariousListInclude,zwMem(),1) ;auslesen
getStrucValue(*varb.VariousListInclude,zwMem(),2)
Debug "+++1=gleich---0=ungleich+++"
For i=0 To *vara\_strcnt-1
If zwMem(i,1)=zwMem(i,2) ;vergleich der zwei Werte
zwMem(i,0)=1 ; 1 wenn gleich
Else
zwMem(i,0)=0 ; 0 wenn ungleich
result0=1
EndIf
Debug "index="+i+" wert="+zwMem(i,0) ;und anzeigen
Debug result0
Next i
Select flag
Case #OG_Compaire_Equal
If result0=0
result=1
Debug "=:"+result
Else
result=0
Debug "=:"+result
EndIf
Case #OG_Compaire_NotEqual
If result0=1
result=1
Debug "<>:"+result
Else
result=0
Debug "<>:"+result
EndIf
EndSelect
ProcedureReturn result
EndProcedure
;zwei Variable.Structure zum Testen
Define Player1.AnimSprite
Player1\_structname=@strctnme$
Player1\_sze=SizeOf(AnimSprite)
Player1\_strcnt=15
Player1\Datei=@dat$
Player1\Name=@nme$
Player1\Anzahl=1
Player1\x=50
Player1\y=100
Player1\xff=400
Player1\yff=200
Player1\srtpnt=7
Player1\lng=6
Player1\frame=4
Player1\xmve=2
Player1\ymve=1
Define Player2.AnimSprite
Player2\_structname=@keinnme$
Player2\_sze=SizeOf(AnimSprite)
Player2\_strcnt=15
Player2\Datei=@das$
Player2\Name=@"Schurke"
Player2\Anzahl=1
Player2\x=50
Player2\y=100
Player2\xff=400
Player2\yff=200
Player2\srtpnt=7
Player2\lng=6
Player2\frame=4
Player2\xmve=1
Player2\ymve=2
showStruc(Player1) ;zeige die Werte
showStruc(Player2)
Debug compStruct(Player1,Player2,#OG_Compaire_Equal) ;Vergleiche,und zeige resultat
EDIT: Code überarbeitet
Olaf