Bug bei Static Strings ...

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Bug bei Static Strings ...

Beitrag von PureLust »

Static macht (momentan) bei String-Values wohl Probleme und speichert die übergebenen Werte nicht:

Code: Alles auswählen

Procedure StaticTest()
	Static a.l = 777
	Static b.s = "Static"
	Protected c.s = "Protected"
	Debug a
	Debug ">"+b+"<"
	Debug ">"+c+"<"
EndProcedure

StaticTest()
Ausgabe:

Code: Alles auswählen

777
><         ; hier sollte >Static< ausgegeben werden
>Protected<
Gruß, PureLust.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Ich glaub der "Bug" wurde schonmal gemeldet. Da diese Zuweisung allerdings keinen Sinn macht (wozu brauchst du eine Static-Variable wenn du sie eh jedes mal neu setzt?) wurde es nicht behoben.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Hallo Deeem, ...

ich hatte Static eigentlich so verstanden, dass der in der Deklaration angegebene, konstante Wert nur beim ersten Aufruf (bzw. einmalig beim Programmstart) zugewiesen wird - also nicht bei jedem weiteren Aufruf neu gesetzt wird. Sonst würde doch die Notwendigkeit eines 'konstanten' Wertes bei der Deklaration keinen wirklichen Sinn machen - oder?

Nachfolgendes kleines Beispiel belegt eigentlich auch auf dieses Verhalten:

Code: Alles auswählen

Procedure StaticTest()
	Static a.l = 777
	Static b.s = "Static"
	Protected c.s = "Protected"
	Debug a
	Debug ">"+b+"<"
	Debug ">"+c+"<"
	a = 888
	b = "bbb"
	c = "---"
EndProcedure

StaticTest()
StaticTest()
Durch o.g. Verhalten nahm ich an, dass Static einen (wenn auch kleinen) Geschwindigkeitsvorteil gegenüber anderen Deklarationsarten hätte. /:->
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag von jear »

@PureLust

Du hast recht. Da steckt ein gehörig Stück Unlogik drin und die Hilfe hält sich bezüglich der Behandlung von Strings völlig bedeckt.

Bei der in PB4 neuen Möglichkeit, einer Variablen bei der Deklaration einen Wert zuzuweisen, hätte man die Static-Variable ausnehmen oder aber konsistent behandeln müssen.

Dem ist nicht so. Während bei einer numerischen Variablen die Zuweisung tatsächlich stattfindet und auch bei weiteren Aufrufen eine konsistente Behandlung als statische Variable richtig erfolgt, ist dies bei Strings nicht so.

Die Hilfe gibt dazu aber keinerlei Hilfe!

Dein leicht modifizierter Code beweist es.

Code: Alles auswählen

Procedure StaticTest(add.s) 
   Static a.l = 777 ; wirkt richtig !
   Static b.s = "Static" ; wirkt nicht !
   Protected c.s = "Protected"
   
   If Not(b) : b = "Static+" : EndIf ; Krücke
   
   a + 3
   b + add
   c + add
    
   Debug a 
   Debug ">"+b+"<" 
   Debug ">"+c+"<" 
   
EndProcedure 

StaticTest("") 
StaticTest("Test1")
StaticTest("Test2")
StaticTest("Test3")
Zuletzt geändert von jear am 21.04.2006 19:24, insgesamt 1-mal geändert.
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Das ist ganz einfach ein Bug.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

hier aber mal einfacher und deutlicher

Code: Alles auswählen

Procedure foo()
  Static stat.s="aaa"
  Debug stat
  stat=stat+"+"
EndProcedure

foo()
foo()
foo()
foo()
foo()
der output

Code: Alles auswählen

aaa
aaa+
aaa+
aaa+
aaa+
beim zweiten aufruf ist das "+" vom ersten aufruf noch dran, die initialisierung wird also nicht wiederholt. ab dem dritten aufruf scheinen die vorherigen aber vergessen zu sein.

stat=stat+"+"
oder
stat+"+"
macht dabei keinen unterschied

Deeem2031 hat geschrieben:Da diese Zuweisung allerdings keinen Sinn macht (wozu brauchst du eine Static-Variable wenn du sie eh jedes mal neu setzt?)
...und was ist mit einem aufrufzähler? denn es funktioniert ja auch nicht wenn man den alten wert mit einbezieht.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

in PB.4.02 gibt's einen assembler error bei initialisierenden zuweisungen bei statischen strings wie z.b. so:

Code: Alles auswählen

Procedure foo()
  Static stat.s="aaa"
  ;...
PureBasic.asm[86]:
Call SYS_FastAllocateString
error: undefined symbol
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

PureLust hat geschrieben:

Code: Alles auswählen

Procedure StaticTest()
	Static a.l = 777
	Static b.s = "Static"
	Protected c.s = "Protected"
	Debug a
	Debug ">"+b+"<"
	Debug ">"+c+"<"
	a = 888
	b = "bbb"
	c = "---"
EndProcedure

StaticTest()
StaticTest()
HÄ? :?
Assembler Error hat geschrieben:PureBasic.asm [87]
CALL SYS_FastAllocateString
error: undefined symbol.
...bekommt ihr den auch oder was läuft da falsch??? :o :o
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

@KG
ich glaube der thread hat seinen urspung in PB.4.00.
dort gab es keinen asm-error, aber die initialisierende zuweisung an einen static string hat auch nicht funktioniert, nur ohne fehlermeldung.
(falls du noch ein PB.4.00 installiert hast, einfach mal ausprobieren)
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ARGL mist... ich muss mir unbedingt angewöhnen aufs datum zu gucken...
>__< o_O _._

ne, ein 4.00 hab ich nicht mehr, drei Installationen von PB reichen mir... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Gesperrt