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
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:
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???

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...
