Seite 1 von 2

Bug bei Static Strings ...

Verfasst: 19.04.2006 20:43
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.

Verfasst: 19.04.2006 21:49
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.

Verfasst: 20.04.2006 01:42
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. /:->

Verfasst: 20.04.2006 10:19
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")

Verfasst: 20.04.2006 10:51
von remi_meier
Das ist ganz einfach ein Bug.

Verfasst: 16.06.2006 16:20
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.

Verfasst: 18.02.2007 14:33
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

Verfasst: 18.02.2007 15:04
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

Verfasst: 18.02.2007 15:08
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)

Verfasst: 18.02.2007 15:11
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... ;)