Bug: *s.STRING mit leerem Inhalt und ValQ(*s\s)

Fragen und Bugreports zur PureBasic 4.0-Beta.
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

Bug: *s.STRING mit leerem Inhalt und ValQ(*s\s)

Beitrag von NicTheQuick »

Ich habe endlich den Fehler in meiner Datenbank gefunden, der mich
schon die ganze Zeit beschäftigt.

Dabei macht ValQ() einen Fehler, wo Val() keinen macht. Aber schaut es
euch einfach an:

Code: Alles auswählen

Pointer1.l ;einfacher als AllocateMemory() zu nutzen
*s1.String = @Pointer1

*s1\s = "123456"
Debug "String: '" + *s1\s + "'"
Debug Val(*s1\s)
Debug ValQ(*s1\s)

Pointer2.l
*s2.String = @Pointer2
Debug "String: '" + *s2\s + "'"
Debug Val(*s2\s)
Debug ValQ(*s2\s)
Kann jemand den Fehler liebenswürdiger Weise an Fred weiterleiten, wenn er nicht schon bekannt ist?

Vielen Dank im Vorraus!

///Edit:
Bei ValF() und ValD() treten die selben Fehler auf.
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag von Karl »

Hallo,

ist es nicht eher so, dass bei Val() der Fehler liegt. Immerhin versuchst du, einen nicht initialisierten String in einen Wert zu konvertieren.

Gruß Karl
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Variablen sind in PB nullinitalisiert. Wenn ich einfach so aus heiterem Himmel <Debug b> aufrufe, wird da 0 stehen. Um es bei strings ein bisschen deuticher zu machen: <Debug text$> wird aus heiterem Himmel auch "" ergeben.

<Debug Val(temp$)> wird 0 ergeben, dasselbe mit ValQ() stürzt komischerweise ab (Invalid memory access).
Definiere ich die Variable temp$ aber vorher etwa mit Define, klappt's wunderbar.

Fazit: BUG!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag von Karl »

Na ja, ganz so ist es nicht. Er legt einen Verweis (Pointer) auf eine Speicheradresse, an der ein String abgelegt werden soll (bzw. von dort aus einen weiteren Verweis auf den Heap). Mehr nicht.

Wahrscheinlich ist dann in der Val()-Funktion eine Bedinungsabfrage enthalten - bei den anderen Versionen halt nicht.

Ist sowieso ´ne Unart, nicht initialisierte Variablen zu verwenden. :twisted:


Hey AND51, füge mal das hier vor dem Debug ein und du wirst sehen:

Code: Alles auswählen

*s2\s=""
Gruß Karl
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
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 »

Das Problem habe ich bei meiner Datenbank.

Wenn z.B. die erste Spalte den Typ String hat und man erstellt eine neue
Zeile ohne gleich etwas reinzuschreiben, dann wird nur Speicherplatz für die
Spalten reserviert.
Liest man jetzt aus der neuen Zeile aus Spalte 1 einen Quad aus, liest er den
noch nicht gesetzten String aus und benutzt ValQ() um ihn umzuwandeln. Und
da passiert dann das Unglück.

Ich hab halt keine Lust, dass wenn man 20 String-Spalten hat und mit einem
Mal 1000 Zeilen einfügt, ich alle 20000 Strings automatisch initialisieren
muss, damit bei einem eventuellen GetQuad()-Aufruf kein Fehler passiert.

Ich hab das Problem jetzt so umgangen, dass ich zuerst auf *s\s <> ""
überprüfe und dann erst ValQ() mache. Aber ich finde, dass es anders auch
funktionieren sollte.

Für mich also auch ein klarer Bug.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Kenne mich mit Datenbanken nicht so aus, aber ieso hängst du beim Speichern nicht ein Leerzeichen an den String an, leer oder nicht leer?

Dann würde ValQ() auch keinen Fehler machen und 0 zurückgeben. Merkst du dass der String doch nicht leer ist, benutzt du einfach <Leftstring$, Len(string$)-1)> oder RTrim() <)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
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 »

Ist zu umständlich und es würde unnötig viel Zeit brauchen und Speicher allokiert werden, wenn man z.B. mal eben 100.000 Strings anlegt.

Ich mache es jetzt so, wie ich es die ganze Zeit mache. Das ist am schnellsten. :)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

´Dann würde ich an deiner Stelle aber richtig optimeiren:

*s\s <> "" raus und dafür Not *s\s schreiben 8)

Du hast doch PB 4.00, oder? :wink:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
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

Beitrag von ts-soft »

AND51 hat geschrieben:´Dann würde ich an deiner Stelle aber richtig optimeiren:

*s\s <> "" raus und dafür Not *s\s schreiben 8)

Du hast doch PB 4.00, oder? :wink:
wenn man optimeired wirds sowieso nichts :mrgreen:
Deine vorgeschlagene Syntaxänderung beinhaltet keinerlei Optimierung!
Wie gesagt Syntaxänderung <> Optimierung
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
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Na und? Selbst wenn es keine echte optimierung ist, es ist einfach cooler und besser lesbar!

Ich verweise darüber hinaus noch auf diesen Thread:

Speedtests: MeinString$="" vs. Len(MeinString$)=0
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Gesperrt