Verfasst: 10.05.2006 19:57
nicht über den sinn...
aber den knackpunkt habe ich persönlich erst durch jears präzise darlegung erkannt.
aber den knackpunkt habe ich persönlich erst durch jears präzise darlegung erkannt.
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Natürlich dürfen sie das. GENAU das ist der Zweck von Shared.sTemp.s im Hauptprogramm und Shared sTemp.s in einer Prozedur dürften keinesfalls die gleiche Variable meinen!
Gäbe es eine zweite Prozedur mit Shared sTemp.s wäre der Mechanismus von Shared ausgehebelt.
Wie gesagt, static soll an sich dafür dienen. Zwar ist "shared" eine Art von inversem global, aber es macht schon sinn.Wenn sich zwei Prozeduren eine Variable teilen wollen, dann müsste diese gegen alle Deklarationen abgeschottet sein, die nicht an diesem Verbund teilnehmen.
Die jetzige Implementierung von Shared in PB ist unsinnig und wenig wert, denn sie erlaubt keine privaten Variablen über Prozeduren hinweg.
Insofern ist Shared jetzt nur ein schlechteres Global. Kein Programmteil kann der Integrität von Variablen sicher sein. Das aber wäre es, was Shared ausmachen sollte.
Code: Alles auswählen
Global s.s
s = "Hauptcode"
Procedure Change()
Static a
Static s.s
a+1
s = s + " " + Str(a)
Debug "In Procedure: "+s
EndProcedure
Change()
Change()
Change()
Debug s
Natürlich declariert das erste "test" die Variable und belegt sie mit dem Inhalt. Nur darfs du nicht den Fehler machen und dort vergessen, den Variablentyp anzugeben.Nein, test = kann keine Variable definieren.
Es ist vielmehr das erste Shared, das die Variable test definiert.
Das folgende Beispiel führt schließlich zum Fehler bei der Übersetzung.
Code: Alles auswählen
Declare.s eins()
Declare.s zwei()
test.s = "Aufrufe : " ; bersetzungsfehler !
Debug test
eins()
Debug test
zwei()
Debug test
End
Procedure.s eins()
Shared test.s
test + " eins war dran"
EndProcedure
Procedure.s zwei()
Shared test.s
test + " und zwei war dran"
EndProcedure
Code: Alles auswählen
Procedure eins()
Static test.s
test + " eins war dran"
Debug test
EndProcedure
Procedure zwei()
Static test.s
test + " zwei war dran"
Debug test
EndProcedure
eins() : eins() : zwei() : zwei() : eins() : zwei()
Na da. Hast es doch selber erklärt und ich doch auch. Der einzige Unterschied ist, das die sharedvariable immer im Hauptcode bekannt ist bzw. dort erst declariert sein muß (als lokalte Variable).Wo ist hier eine "Shared"-Wirkung?
Shared definiert eine Variable, die in allen Prozeduren bekannt ist, in denen sie mit Shared definiert ist. Außerdem ist sie im Hauptprogramm definiert, wenn die Definition als Shared in einer Prozedur aus der Sicht des Compilers vor der ersten Ansprache im Hauptprogramm stattgefunden hat. Ist dies nicht der Fall (siehe mein zweites Beispiel), dann ist die Variable auch im Hauptprogramm unbekannt.
Code: Alles auswählen
Declare.s eins()
Declare.s zwei()
test = "Aufrufe : " ; Übersetzungsfehler !
eins()
Debug test
zwei()
Debug test
End
Procedure.s eins()
Shared test.s
test + " eins war dran"
EndProcedure
Procedure.s zwei()
Shared test.s
test + " und zwei war dran"
EndProcedure
Code: Alles auswählen
test = "Aufrufe : " ; Übersetzungsfehler !
Ich meinte nur allgemeine Variablen, für sowas kann man StructureVariablenKaeru Gaman hat geschrieben:> Ansonsten sollte man damit genauso sparsam umgehen, wie mit Global. Lieber als Parameter übergeben!
das ist dein credo, das weiß ich schon.
aber ich finde, man sollte das nicht so generalisieren.
wenn ich z.b. zwei dutzend procs habe, die alle die mauskoordinaten verarbeiten sollen,
fände ich es reichlich unpraktisch, die jedesmal als argumente zu übergeben...