[PB4 B11] kleiner Fehler mit Shared

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

[PB4 B11] kleiner Fehler mit Shared

Beitrag 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))
Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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
1. Win10
PB6.1
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Das hat aber nichts mit shared zu tun ;-)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

würde aber bei jedem prozedure Start die Variable löschen, oder nicht?
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag 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)
Gesperrt