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
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ah stimmt, ist mir noch nie aufgefallen, denn SizeOf gibt mir hier ja auch nur 16 (also 4 Felder) an
Structure T
 Waffe.l[4]
EndStructure
Debug SizeOf(T)
gut danke
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
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

Verdammt wieso bekomm ich beim lesen dieser Struct hunger ..? Muss an der Hitze liegen oder so ... :mrgreen:

Code: Alles auswählen

... "Waffe.l" ...
Sorry für OT ;)

Thalius
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

@NTQ
Wieso benutzt du ständig Sizeof?

Kann man da nicht direkt die Werte eintragen?
Stehen doch in der Hilfe...

[Edit]
Nochwas, macht es einen Unterschied ob man ' oder " schreibt?
[/Edit]

Gruß
Scarabol
Zuletzt geändert von Scarabol am 13.08.2007 16:16, insgesamt 2-mal geändert.
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Scarabol hat geschrieben:@NTQ [...]
schreib ihm lieber eine PN. Er ist in der letzten Zeit nicht so
häufig im Board.
Scarabol hat geschrieben:[Edit]
Nochwas macht es einen Unterschied ob man ' oder " schreibt?
[/Edit]
ja, ist ein (undokumentiertes?) Feature:

Code: Alles auswählen

Debug "e"
Debug 'e'
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Ok danke gibt also den Ascii zurück
Wieso wird sowas nicht kommentiert?

Achja nochwas,
Der letzte Parameter von WriteStructure ist ja ein Pointer, oder?
Wenn ja wieso passt der in einen Character Datentyp der eigentlich viel zu klein ist???

[Edit]
Habs inzwischen selbst rausgefunden. Diese übergabe bewirkt das jeder character des String einzeln abegerufen werden kann.

Kann man nicht direkt mit Sizeof die Größe der Struktur ermitteln?
[/Edit]

Gruß
Scarabol
Zuletzt geändert von Scarabol am 13.08.2007 17:35, insgesamt 1-mal geändert.
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Kann ich damit auch solche Strukturen speichern, oder wie müsste ich den Code ändern?

structure intest
stuff.l
stuff.f
endstructure

structure test
test.intest[100]
endstructure

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Wieso führt die Procedure ReadStructure auf ein L-Listen Element angewendet zu einem Error?

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Scarabol hat geschrieben:Ok danke gibt also den Ascii zurück
Wieso wird sowas nicht kommentiert?
Das solltest du Fred fragen :wink:
Achja nochwas,
Der letzte Parameter von WriteStructure ist ja ein Pointer, oder?
Wenn ja wieso passt der in einen Character Datentyp der eigentlich viel zu klein ist???
Wie meinst du das? Hier solltest du einfach einen Pointer eines Strings
übergeben ... alles andere führt, spätestens zur laufzeit, zu unerklärlichen
und eventuell sogar spontanen Fehlern!
[Edit]
Habs inzwischen selbst rausgefunden. Diese übergabe bewirkt das jeder character des String einzeln abegerufen werden kann.

Kann man nicht direkt mit Sizeof die Größe der Struktur ermitteln?
[/Edit]
Welche Größe? Die des Strings? Nein, Sizeof ermittelt zur Compilerzeit
die Strukturgröße, ein String hat eine dynamische Länge. Das geht also
von der Logik her nicht. Als alternative zu NTQs Variante könnte man mit
PeekC() den String Zeichenweise einlesen, oder per PeekS() und
Zeichenlänge auf 1 setzten.
Kann ich damit auch solche Strukturen speichern, oder wie müsste ich den Code ändern?

structure intest
stuff.l
stuff.f
endstructure

structure test
test.intest[100]
endstructure
Intern siehts so aus, das du 100 mal die beiden Strukturfelder stuff.l und
stuff.f hast, also müsste der Strukturstring so aussehen:

Code: Alles auswählen

StrukturString$ = ""
For i = 0 To 99
  StrukturString$ + "lf"
Next
Wieso führt die Procedure ReadStructure auf ein L-Listen Element angewendet zu einem Error?

Gruß
Scarabol
Weil du etwas falsch machst :D ... falscher Strukturstring? ... ohne
Quellcode hilft da nur ne Glaskugel :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
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

Beitrag von NicTheQuick »

Scarabol hat geschrieben:Kann ich damit auch solche Strukturen speichern, oder wie müsste ich den Code ändern?

structure intest
stuff.l
stuff.f
endstructure

structure test
test.intest[100]
endstructure
Ich habe eben extra für dich den Code geändert (s. 1. Post). In deinem
Beispiel wäre die Struktur jetzt als "[100lf]" abbildbar. Probier es einfach
mal aus.

Mit meinen Beispielen funktioniert alles. Aber man weiß ja nie. Also immer
schön Bugs reporten.

Warum ReadStructure() bei LinkedLists nicht funktioniert, weiß ich nicht.
Du gibst mir ja kein Beispiel, an dem ich es nachvollziehen kann.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Erstma Danke an NTQ und natürlich an PMV.

So also hier mal ein Auszug meinse Codes (will euch die anderen 2600 Zeilen ersparen):

Code: Alles auswählen

          Struc = "lllffdllllsllll"
          c = ReadLong(1)
          ClearList(Ant())
          For i = 0 To c
            AddElement(Ant())
            ReadStructure(1, Ant(), @Struc)
          Next
Wenn ich das Programm ausführe führt der Befehl "Var\s = Space()" zu einem Invalid Memory Access.

Code: Alles auswählen

      Case 's'
        If length
          ReadData(FileId, *Var, length)
          *Var + length
        EndIf
        length = ReadLong(FileId)
; ---- hier kommt der Invalid Memory Access
        *Var\s = Space(length)
; ----
        ReadData(FileId, @*Var\s, length)
        *Var + SizeOf(String)
        length = 0
    EndSelect
[Edit]
Scheine das Problem vorläufig gelöst zu haben, lag daran das ich die Writestrings nicht mit einer Null beendet hab.
[/Edit]

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Antworten