Seite 1 von 4

[PB4 B11] kleiner Fehler mit Shared

Verfasst: 08.05.2006 18:15
von MVXA
Hi,
dieses kleine Beispiel verursacht einen invalid memory access, wenn die
Variable sTemp nicht vorher benutzt wird. Ist das Absicht oder ein Bug?

Code: Alles auswählen

Procedure Test(*pBuffer.Byte)
    Shared sTemp.s
    
    If *pBuffer
        PokeS(*pBuffer, sTemp)
    EndIf
EndProcedure


; sTemp = "mep"
Test(AllocateMemory($FF))

Verfasst: 09.05.2006 07:57
von Toshy
Ist eigendlich ne gute Frage.
Aber ich vermute, daß dies keine Bug ist. Shared ist ja kein Ersatz für Global, es erlaubt ja nur den Zugriff auf eine vorher schon "declarierte" Variable. Jetzt versucht die Procedure auf eine Variable zuzugreifen, die es noch gar nicht gibt. Das dies eine SPeicherfehlermeldung auslöst dürfte dann meinem Verständnis nach ok sein.

Um solche Fehler auszuschließen bzw. zu finden dient ja
"EnableExplicit/DisableExplicit"

[edit]
mir fällt gerade auf, das "EnableExplicit/DisableExplicit" nicht in der Hilfedatei steht.

Toshy

Verfasst: 09.05.2006 08:55
von Kaeru Gaman
ich finde das schon merkwürdig, dass die Variable nicht beim ersten abarbeiten der shared-deklaration auf leer gesetzt wird. meiner auffassung nach sollte sie danach existent sein...

Verfasst: 09.05.2006 09:05
von mk-soft
Fehler ? Jaein,

Interesssant zu sehen. Erst wenn eine Variable verwendet wird, wird diese auch angelegt. Bring auf jeden fall ein Geschwindigkeitsvorteil.
Denke ich

FF :wink:

Verfasst: 09.05.2006 14:45
von MVXA
Eher Nachteil. Die Variable muss zur Laufzeit erstellt werden, was
Geschw. kostet. Wenn man die Variable am Anfang des Programms
anlegt, dauert der Programmstart etwas länger, ist aber zur Laufzeit
schneller.

Verfasst: 09.05.2006 14:56
von edel
Das hat aber nichts mit shared zu tun ;-)

Verfasst: 09.05.2006 16:06
von Kaeru Gaman
hallodri hat geschrieben:Das hat aber nichts mit shared zu tun ;-)
du meinst, eine deklaration ohne zuweisung reserviert nie speicher?

also müßte ja

Code: Alles auswählen

Shared sTemp.s = ""
das problem beheben...

Verfasst: 09.05.2006 16:23
von MVXA
würde aber bei jedem prozedure Start die Variable löschen, oder nicht?

Verfasst: 09.05.2006 16:27
von Kaeru Gaman
also, bei Static bin ich sicher, dass nur der erste aufruf zuweist.
bei Shared müsste es analog sein, wär ja sonst auch unsinn.
aber mit sicherheit kann ichs nicht sagen, probiers halt mal aus.

Verfasst: 09.05.2006 18:51
von real
Der Absturz ist doch völlig normal!

Shared erlaubt den Zugriff auf eine bereits definierte Variable auch in einer Prozedur. Wenn Du die Variable nicht definiert hast, kannst Du darauf auch keinen Zugriff zulassen.

@MVXA: Laß mich raten... Als Du in die Prozedur einfach mit

Code: Alles auswählen

Shared sTemp
testen wolltest hast Du spätestens bei der Nutzung im PokeS einen Hinweis bekommen, dass die Variable nicht den korrekten Datentypen hat?! Wie man in der Hilfe sehen kann, ist die Angabe des Typs bei der Shared-Deklaration aber nicht erforderlich. Weil... (siehe oben)