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
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Re: Write-, ReadStructure (3. Update)

Beitrag von Hyper »

Hallo NicTheQuick und ts-soft,

wahnsinn, seid Ihr schnell, super! Ich habe jetzt, so wie ts-soft angegeben hat *Var\s durch *Var\s\s ersetzt und bin über die Stelle erst mal drüber weg (und hänge jetzt an ganz anderen Stellen).

@NicTheQuick: Ich würde lieber bei unserer alten und einfacheren Variante bleiben und diese nur korrigieren, die kann ich noch halbwegs durchschauen.

Danke erstmal, ich gebe nochmal Bescheid, obs so klappt!
PB 5.72
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Re: Write-, ReadStructure (3. Update)

Beitrag von Hyper »

Hallo zusammen,

ich habe mein Programm jetzt konvertiert nach PB510, nur das Lesen und Speichern klappt noch nicht. Ich habe mal den Code isoliert, so dass man das separat mal testen kann.

Das Ersetzen von *Var\s durch *Var\s\s schmeckt PB leider nicht. Könnt Ihr mir noch einmal helfen?

Code: Alles auswählen

EnableExplicit

CreateFile (1, "C:\test_write_structure.dat")

; 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.String       ; PB 510, vorher *s.s
    c.c
    q.q
    d.d
  EndStructureUnion
EndStructure

Structure sty_speicherliste
  Nummer.l
  name.s  
EndStructure  

; Neue Liste erzeugen
NewList li_speicherliste.sty_speicherliste()

; Structure Filed Type Definition
Global SFTD.s = "ls" 

Procedure   sy_WriteStructure(*Var.sty_AllTypes, *SFTD.Byte, l_FileID)
  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
        
        Debug *Var\s
        Debug @*Var\s\s
        
        ; Fehler PB 510: Ungültiger Speicherzugriff:
        length = Len(*Var\s\s) ; PB 510, vorher length = Len(*Var\s)    

        ; 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

; test
AddElement( li_speicherliste() )
li_speicherliste()\Nummer = 1
li_speicherliste()\Name   = "Meier"


AddElement( li_speicherliste() )
li_speicherliste()\Nummer = 2
li_speicherliste()\Name   = "Huber"

ForEach li_speicherliste()
  sy_WriteStructure(@li_speicherliste(),@SFTD, 1)
Next 
PB 5.72
Antworten