Größe von Fixed Strings

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Little John

Größe von Fixed Strings

Beitrag von Little John »

Hallo zusammen,

bei der Übersetzung eines Programms auf der MSDN-Website von C nach PureBasic ist ein merkwürdiges Problem aufgetreten. Das folgende Programmfragment hängt sich auf (getestet mit PB 4.10 Beta 3 unter Windows XP Pro SP 2):

Code: Alles auswählen

#MAX_VALUE_NAME = 16383
; #MAX_VALUE_NAME = 11000

Procedure QueryKey()
   Protected achValue.s{#MAX_VALUE_NAME}

   Debug "OK"
EndProcedure

QueryKey()
Wenn die Konstante z.B. den Wert 11000 hat hängt sich das Programm hingegen nicht auf.

In der Hilfe zu den Variablentypen steht aber für Fixed String: "Range unlimited". Und bei 2 Gigabyte Arbeitsspeicher habe ich auch noch etwas Platz frei. :) Ich vermute hier handelt es sich um einen Bug.

Gruß, Little John
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag von rolaf »

Zur Info: Unter Beta 4 und Win2k habe ich hier das gleiche Verhalten.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Falo hat geschrieben:Zur Info: Unter Beta 4 und Win2k habe ich hier das gleiche Verhalten.
Die Grenze liegt (bei mir) bei 16320 Zeichen:

#MAX_VALUE_NAME = 16320 ; geht

#MAX_VALUE_NAME = 16321 ; geht nicht

Grüße ... Kiffi (Beta 4 & Windows XP SP2)
a²+b²=mc²
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

also, in Proceduren wird der Stack für Variablen benutzt.
(Thema Tread-Sicherheit)
Normale Strings betrifft das nicht, aber fixed strings schon.
Abhilfe:
Bei den Linker-Optionen den Stack hochsetzen,
Schreibt ne textdatei wo das drin steht:

/Stack:Neue Größe

Ausserhalb von Proceduren klappts übrigens, da dort
anders der speicher reserviert wird.
Rings hat geschrieben:ziert sich nich beim zitieren
Little John

Beitrag von Little John »

Rings, vielen Dank für die Erklärung!

Da wäre es schön, wenn PB in so einem Fall eine Fehlermeldung wie z.B. "Stack nicht groß genug". o.Ä. anzeigen würde.
Und in der Hilfe zu Fixed String sollte besser etwa stehen:
Größe außerhalb von Prozeduren unbegrenzt, innerhalb von Prozeduren abhängig von der aktuellen Stack-Größe
Rings hat geschrieben:Abhilfe:
Bei den Linker-Optionen den Stack hochsetzen,
Schreibt ne textdatei wo das drin steht:

/Stack:Neue Größe
Dazu habe ich auch nichts in der Hilfe gefunden (oder stehe ich grad' auf dem Schlauch?).
Wie muss die Textdatei heißen, und in welchem Verzeichnis muss sie sich befinden?

Danke, Little John
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Little John hat geschrieben:Rings, vielen Dank für die Erklärung!
ab und an kann man ja mal paar internas ausplaudern.
Findet man recht einfach heraus indem man mit /Commented
kompiliert.
Little John hat geschrieben: Da wäre es schön, wenn PB in so einem Fall eine Fehlermeldung wie z.B. "Stack nicht groß genug". o.Ä. anzeigen würde.
Und in der Hilfe zu Fixed String sollte besser etwa stehen:
Größe außerhalb von Prozeduren unbegrenzt, innerhalb von Prozeduren abhängig von der aktuellen Stack-Größe
Ja, sehe ich auch so.
Little John hat geschrieben: Dazu habe ich auch nichts in der Hilfe gefunden (oder stehe ich grad' auf dem Schlauch?).
Wie muss die Textdatei heißen, und in welchem Verzeichnis muss sie sich befinden?
polink.exe (im Compiler verzeichnis) aufrufen mit :
Polink /?
Im PBEditor unter Compiler-Optionen bei Linker-OptionenDatei den Datei Namen eintragen.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Rings hat geschrieben:ziert sich nich beim zitieren
Little John

Beitrag von Little John »

PB bietet so viele Möglichkeiten ...
Finde ich im Prinzip auch toll, aber es ist schwer da den Überblick zu bekommen.
Vielen Dank nochmal für die Hinweise!

Leider funktioniert das Code-Schnipsel aus meinem ersten Beitrag immer noch nicht.
Zuerst hatte ich in die Datei geschrieben
/Stack:32000
... ohne Erfolg. Dann habe ich den Wert immer weiter vergrößert, bis ich zum Schluss hatte
/Stack:67108864
Das sind 64 MB. :-) Das Programm verhält sich immer noch wie am Anfang.

Ich hatte zwischendurch probehalber 'mal zwischen Doppelpunkt und Zahl ein Leerzeichen geschrieben.
Dabei generierte PB einen "fatal error", wodurch verifiziert war dass die Textdatei mit der Linker-Option
tatsächlich gelesen wird. Wat nu?

Rings hat geschrieben:Als Bug/Hinweis weitergemeldet

http://www.purebasic.fr/english/viewtop ... 516#217516
Danke!

Gruß, Little John
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Du kannst dir auch so helfen:

Code: Alles auswählen

;------- Some Local Fixed Strings Helpers -----------

Structure _LOCAL_FIXED_STRUCTURE_
	Length.l
	*String
EndStructure

Procedure.l CREATE_LOCAL_FIXED_STRING(Length.l)
	Protected *a._LOCAL_FIXED_STRUCTURE_
	
	*a        = AllocateMemory(4 + Length * SizeOf(CHARACTER))
	*a\Length = Length
	
	ProcedureReturn *a
EndProcedure

Procedure.l FILL_LOCAL_FIXED_STRING(*a._LOCAL_FIXED_STRUCTURE_, String.s)
	If StringByteLength(String) < *a\Length
		CopyMemory(@String, *a + OffsetOf(_LOCAL_FIXED_STRUCTURE_\String), StringByteLength(String) + SizeOf(CHARACTER))
	Else
		CopyMemory(@String, *a + OffsetOf(_LOCAL_FIXED_STRUCTURE_\String), *a\Length)
	EndIf
EndProcedure

Procedure.s READ_LOCAL_FIXED_STRING(*a._LOCAL_FIXED_STRUCTURE_)
	ProcedureReturn PeekS(*a + OffsetOf(_LOCAL_FIXED_STRUCTURE_\String), *a\Length)
EndProcedure

Macro FREE_LOCAL_FIXED_STRING(a)
	FreeMemory(a)
EndMacro


;---------------------------

#MAX_VALUE_NAME = 16384
; #MAX_VALUE_NAME = 11000

Procedure QueryKey()
   Protected *achValue = CREATE_LOCAL_FIXED_STRING(#MAX_VALUE_NAME)

   FILL_LOCAL_FIXED_STRING(*achValue, "Ja Mei, wie kimmst denn du da her ?")
   
   
   Debug READ_LOCAL_FIXED_STRING(*achValue)
   
   FREE_LOCAL_FIXED_STRING(*achValue)
EndProcedure

QueryKey()
Little John

Beitrag von Little John »

Hallo HeX0R,

danke!
So ähnlich -- also basierend auf AllocateMemory() -- habe ich es jetzt schon gemacht. Ich hatte aber nicht so eine schöne Lösung entwickelt wie Du. Du hast ja quasi den Datentyp FIXED STRING neu implementiert. Solche allgemeingültigen Lösungen finde ich immer sehr gut.

Gruß, Little John
Antworten