Seite 5 von 6

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

Verfasst: 26.04.2010 21:13
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

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

Verfasst: 26.04.2010 22:05
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.

Re: Write-, ReadStructure (3. Update)

Verfasst: 27.04.2010 01:06
von NicTheQuick
Ich habe noch ein kleines Update gemacht. Siehe erstes Post und Edit 7.

Re: Write-, ReadStructure (3. Update)

Verfasst: 27.04.2010 01:53
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.

Re: Write-, ReadStructure (3. Update)

Verfasst: 27.04.2010 02:29
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:

Re: Write-, ReadStructure (3. Update)

Verfasst: 27.04.2010 06:52
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 ....

Re: Write-, ReadStructure (3. Update)

Verfasst: 27.01.2013 20:08
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?

Re: Write-, ReadStructure (3. Update)

Verfasst: 27.01.2013 20:32
von NicTheQuick
Ich schau mir's gleich mal an und korrigiere alles für die neue Version.

Re: Write-, ReadStructure (3. Update)

Verfasst: 27.01.2013 20:35
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:

Re: Write-, ReadStructure (3. Update)

Verfasst: 27.01.2013 20:40
von NicTheQuick
Mein Code ist korrekt, du nutzt nur eine alte Version. Im ersten Post dieses Threads findest du immer den aktuellsten Code.