@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
Anzahl der Felder in einer Structure ermitteln
Re: Anzahl der Felder in einer Structure ermitteln
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Re: Anzahl der Felder in einer Structure ermitteln
@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?
Olaf
EDIT: sorry,hab meinen Irrtum Erkannt(VariousList())
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
EDIT: sorry,hab meinen Irrtum Erkannt(VariousList())
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Anzahl der Felder in einer Structure ermitteln
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
Genauso hab ich das auch gesehen,und bereits einige anpassungen vorgenommenNicTheQuick 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.
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
Der Feldtype intressiert mich hier nicht,nur die RawData der MemoryCell wird zum Vergleich herrangezogen.
Danke nochmal
Olaf
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Re: Anzahl der Felder in einer Structure ermitteln
Hallo
Ähm , hat sich gerade erledigt.
Sobald ich die Frage sah,sah ich auch die Antwort
Olaf
Ähm , hat sich gerade erledigt.
Sobald ich die Frage sah,sah ich auch die Antwort
Olaf
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Re: Anzahl der Felder in einer Structure ermitteln
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
>: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
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
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
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Re: Anzahl der Felder in einer Structure ermitteln
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
EDIT: Code überarbeitet
Olaf
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
Olaf
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic