Write-, ReadStructure (3. Update)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Write-, Read-, CopyStructure (2. Update)

Beitrag von ts-soft »

:allright:

lediglich "bless" kann er nicht starten :mrgreen:

PS: Als 64-Bit User solltest zumindest Du Dir das Procedure.l abgewöhnen, entweder .i oder weglassen.

Gruß

Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Write-, Read-, CopyStructure (2. Update)

Beitrag von NicTheQuick »

ts-soft hat geschrieben:lediglich "bless" kann er nicht starten :mrgreen:

PS: Als 64-Bit User solltest zumindest Du Dir das Procedure.l abgewöhnen, entweder .i oder weglassen.
Ok, Beispiele gehen jetzt für Windows und Linux, solange 'bless' installiert ist.

Außerdem haben die Procedures jetzt den Rückgabewert Integer.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Write-, ReadStructure (3. Update)

Beitrag von NicTheQuick »

Ich habe noch ein kleines Update gemacht. Siehe erstes Post und Edit 7.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Write-, ReadStructure (3. Update)

Beitrag von STARGÅTE »

Will ja diese Varinate von Write/Read Structure nicht schlecht reden und finde auch gut das du es Aktuell hältst, aber ich finde sie zimlich "anfällig" für menschliches Versagen.

Du benutzt ja ein String, der die Struktur in "Zeichen" enthält. Das heißt aber, dass man diesen String immer aktuallisieren muss wenn man die Struktur ändert, was bei großen Strukturen zimlich schwer wird, da man nicht auf anhieb die richtige Stelle im String findet, an der man ein feld hinzugefügt hat.
Denn wird der Struktur-String zur Struktur asynkron, gibs eine große Quelle für Bugs ...

Da finde ich die Variante die mk-soft ins Leben gerufen hat CopyStructure - auch mit Strings, und ich mit PokeT und PeekT erweitert habe,
aus dem Thema Strukturierte Daten in Exe einbinden einfacher, bzw. wäre es eine Alternative, da man dort nur einmal die Struktur selber "initialisieren" muss, da dort die Struktur direkt aus dem Speicher "erlesen" wird.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Write-, ReadStructure (3. Update)

Beitrag von NicTheQuick »

CopyStructure() gibt es jetzt ja schon nativ in PureBasic.
Und das diese Strings fehleranfällig sind ist klar. Ich hätte auch gerne native PB-Methoden, die das für mich erledigen. Vielleicht hast du ja Lust das Beispiel von mk-soft für die File-Library zu erweitern. Ich habe mit den Code jetzt nämlich nicht genauer angeschaut, weil ich mit meinem zufrieden bin, obwohl ich ihn bisher noch nie gebraucht habe. :mrgreen:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Write-, ReadStructure (3. Update)

Beitrag von STARGÅTE »

JO hab ich ja schon gemacht:
HIER
Es ist sogar auch noch 4.50 fähig.

Kurzsfassung:
- die Struktur die man benutzen will, "initiallisieren" mit : AddStructureData(StructureName)
- und dann für Files: WriteStructure(File, Variable, StructureName) / ReadStructure(File, Variable, StructureName)
- für den Speicher: PokeT und PeekT
- und zu einfach nur angucken der Structure : GetStructureData(StructureName)

Aber wie schon im Link geschrieben, es ist zwar funktionsfähig, aber nciht fertig, weil ich gleich noch alle anderen Sorten einbauen wollte: WriteList, WriteMap usw.
natürlich auch mit Strukturen ....
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Re: Write-, ReadStructure (3. Update)

Beitrag von Hyper »

Hallo Gefährten,

ich nutze die ursprünglich von NicTheQuic gebaute Logik zum Abspeichern von Strukturen und strukturierten Listen. Jetzt hab ich mal angefangen PureBasic 5.10 Beta 5 zu testen und bekomme eine Fehlermeldung und bin mir unschlüssig, was im Code geändert werden muss (ist wahrscheinlich nicht viel).
Hier ist Stelle 1, an welcher die Strutur definiert wird:

Code: Alles auswählen

; Zum Speichern und Laden von Listen
Structure sty_AllTypes        ;NicTheQuic    
  StructureUnion              ;hierdurch beginnen alle Variablen 
    b.b                       ;an derselben Speicheradresse
    w.w
    l.l
    f.f
    *s.s  ;Hier bringt jetzt PB510 Fehler "Native Types can't be used with pointers"
    c.c
    q.q
    d.d
  EndStructureUnion
EndStructure
Ich habe nun mal statt *s.s nur *s geschrieben (ist das richtig?), das hat der Compiler nicht bemeckert. Nun läuft aber Stelle 2 auf einen Fehler, wo in das File geschrieben wird, da der String jetzt nicht mehr als solcher erkannt wird (Stelle length = Len(*Var\s)):

Code: Alles auswählen

 Procedure   sy_WriteStructure(*Var.sty_AllTypes, *SFTD.Byte, l_FileID)
; *Var.sty_AllTypes =Ptr auf akt. Listen-Element
; *SFTD.Byte = Structure Field Type Definition, z.B. "bsslllw"

  Protected length.l
       
  ; Durchlauf durch Struktur-Feld-Typ-Definition
  ; Pro Feld gehts einmal in die Schleife
  While *SFTD\b
    
    ; je nach Feldtyp 
    ; a) Auswahl des korrekten Speicher-Befehls und
    ; b) Weiterrücken des Pointers je nach Speicherbedarf des Feldtyps
    Select *SFTD\b
      Case 'b'   ; Typ = Byte
                 ; schreibe Byte; hole Inhalt aus Speicherbereich  
                 WriteByte  (l_FileID, *Var\b)  : *Var + 1 ; setze Pointer um 1 weiter  
      Case 'w' : WriteWord (l_FileID, *Var\w)  : *Var + 2
      Case 'l' : WriteLong (l_FileID, *Var\l)  : *Var + 4
      Case 'f' : WriteFloat(l_FileID, *Var\f)  : *Var + 4
      Case 's': 
        ;/ Typ = String
        ; Länge ermitteln, da aktueller Inhalt von SFTD = s ist,
        ; muss es ein String sein
        length = Len(*Var\s) ; --> Hier kommt der Fehler bei PB510 Beta 5: "Falscher Parameter-Typ: ein String wird erwartet"
        ; Länge des Strings schreiben, auch wenn = 0
        WriteLong(l_FileID, length)
        ; Nur wenn Länge > 0, d.h. String nicht leer schreiben
        ; "@*Var\s"  --> genial: Inhalt des Speicherbereiches,
        ; auf den der Pointer *Var\s zeigt.
        If length : WriteData(l_FileID, @*Var\s, length) : EndIf
        *Var + 4
    EndSelect
    ; Den Zeiger auf SFTD eins weiterrücken
    ; SFTD hat Typ BYTE, d.h es besteht aus Byte-Elementen, diese verbrauchen  
    ; 1 Byte, damit erwischt + 1 das nächste Zeichen
    *SFTD + 1 
  Wend
  
  ;a + 1
EndProcedure 
Hinweis: Die Prozedur wird dann für die Liste so aufgerufen:

Code: Alles auswählen

 Global Dim SFTD.s(20)
SFTD(1) = "bsslllw"

ForEach li_Element()
  sy_WriteStructure(@li_Element(), @SFTD(1), #File)    
Next
Kann mir jemand helfen?
PB 5.72
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Write-, ReadStructure (3. Update)

Beitrag von NicTheQuick »

Ich schau mir's gleich mal an und korrigiere alles für die neue Version.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Write-, ReadStructure (3. Update)

Beitrag von ts-soft »

Code: Alles auswählen

Structure sty_AllTypes        ;NicTheQuic   
  StructureUnion              ;hierdurch beginnen alle Variablen
    b.b                       ;an derselben Speicheradresse
    w.w
    l.l
    f.f
    *s.String
    q.q
    d.d
  EndStructureUnion
EndStructure

Code: Alles auswählen

Procedure   sy_WriteStructure(*Var.sty_AllTypes, *SFTD.Byte, l_FileID)
; *Var.sty_AllTypes =Ptr auf akt. Listen-Element
; *SFTD.Byte = Structure Field Type Definition, z.B. "bsslllw"

  Protected length.l
       
  ; Durchlauf durch Struktur-Feld-Typ-Definition
  ; Pro Feld gehts einmal in die Schleife
  While *SFTD\b
   
    ; je nach Feldtyp
    ; a) Auswahl des korrekten Speicher-Befehls und
    ; b) Weiterrücken des Pointers je nach Speicherbedarf des Feldtyps
    Select *SFTD\b
      Case 'b'   ; Typ = Byte
                 ; schreibe Byte; hole Inhalt aus Speicherbereich 
                 WriteByte  (l_FileID, *Var\b)  : *Var + 1 ; setze Pointer um 1 weiter 
      Case 'w' : WriteWord (l_FileID, *Var\w)  : *Var + 2
      Case 'l' : WriteLong (l_FileID, *Var\l)  : *Var + 4
      Case 'f' : WriteFloat(l_FileID, *Var\f)  : *Var + 4
      Case 's':
        ;/ Typ = String
        ; Länge ermitteln, da aktueller Inhalt von SFTD = s ist,
        ; muss es ein String sein
        length = Len(*Var\s\s) ; --> Hier kommt der Fehler bei PB510 Beta 5: "Falscher Parameter-Typ: ein String wird erwartet"
        ; Länge des Strings schreiben, auch wenn = 0
        WriteLong(l_FileID, length)
        ; Nur wenn Länge > 0, d.h. String nicht leer schreiben
        ; "@*Var\s"  --> genial: Inhalt des Speicherbereiches,
        ; auf den der Pointer *Var\s zeigt.
        If length : WriteData(l_FileID, @*Var\s, length) : EndIf
        *Var + 4
    EndSelect
    ; Den Zeiger auf SFTD eins weiterrücken
    ; SFTD hat Typ BYTE, d.h es besteht aus Byte-Elementen, diese verbrauchen 
    ; 1 Byte, damit erwischt + 1 das nächste Zeichen
    *SFTD + 1
  Wend
 
  ;a + 1
EndProcedure 
Sind bestimmt noch kleine Änderungen nötig, aber ohne vollständigen Testcode hab ich da keinen Bock drauf :mrgreen:

Erstmal keine Fehlermeldungen, ob die Strings noch gehen, mußt Du selber testen.

Gruß
Thomas

// Nic war schneller, warte lieber bis er was liefert :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Write-, ReadStructure (3. Update)

Beitrag von NicTheQuick »

Mein Code ist korrekt, du nutzt nur eine alte Version. Im ersten Post dieses Threads findest du immer den aktuellsten Code.
Antworten