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!
Write-, ReadStructure (3. Update)
Re: Write-, ReadStructure (3. Update)
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?
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