Anzahl der Felder in einer Structure ermitteln

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: Anzahl der Felder in einer Structure ermitteln

Beitrag 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
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
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: Anzahl der Felder in einer Structure ermitteln

Beitrag 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())
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
Benutzeravatar
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

Beitrag 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.
Bild
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: Anzahl der Felder in einer Structure ermitteln

Beitrag 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
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
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: Anzahl der Felder in einer Structure ermitteln

Beitrag von Olafmagne »

Hallo
Ähm , hat sich gerade erledigt.
Sobald ich die Frage sah,sah ich auch die Antwort :oops:

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
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: Anzahl der Felder in einer Structure ermitteln

Beitrag 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
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
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: Anzahl der Felder in einer Structure ermitteln

Beitrag 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
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
Antworten