Seite 2 von 4

Verfasst: 09.05.2006 19:39
von MVXA
falsch geraten...

Verfasst: 09.05.2006 20:37
von Toshy
@real
sag ich ja :-)

Verfasst: 09.05.2006 22:59
von jear
Große Frage : Macht eine singulare Shared-Definition überhaupt Sinn?
Muss nicht vielmehr mindestens ein Paar Shared-Deklarationen auf die gleiche Variable existieren?

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.

IMHO ist es ein kapitaler Kinken, dass der Compiler ein singulares Shared nicht bemängelt!

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.

Verfasst: 10.05.2006 13:13
von real
@MVXA:
Naja - bei mir kam beim Test eine Meldung in der Art...

@jear:
Denk dran: Mit "Shared" definierst Du keine Variable, Du zeigst damit lediglich an, dass Du die bereits definierte Varialbe in der entsprechenden Prozedur nutzen willst.

Verfasst: 10.05.2006 16:16
von jear
real hat geschrieben:@jear:
Denk dran: Mit "Shared" definierst Du keine Variable, Du zeigst damit lediglich an, dass Du die bereits definierte Varialbe in der entsprechenden Prozedur nutzen willst.

Code: Alles auswählen

Procedure.s eins()
  Shared test.s
  test + " eins war dran"
EndProcedure

Procedure.s zwei()
  Shared test.s
  test + " und zwei war dran"
EndProcedure

test = "Aufrufe : "

eins()
Debug test

zwei()
Debug test
  
End
Wo ist test denn nun definiert worden? Doch wohl durch Shared.

Das Beispiel zeigt gut, wie gefährlich und unsinnig die jetzige Konstruktion ist!

Verfasst: 10.05.2006 16:23
von Kaeru Gaman
in diesem falle wurde sie durch das

Code: Alles auswählen

test = "Aufrufe : " 
definiert.

aber grundsätzlich gebe ich dir recht, was deine hinterfragung betrifft.

allerdings habe ich shared bisher so verstanden, dass es proceduren zugriff auf außenliegende, also auf main-ebene befindliche variablen ermöglicht.
variablen gleichen namens ohne shared sind dann proceduren-intern.

somit ist es parallel zu Protected, das ermöglicht proceduren-interne variablen gegen Global deklarierte variablen gleichen namens zu kapseln.

das ganze konzept ist wohl grundsätzlich procedurales gedankengut und konträr zu OOP-prinzipien, aber PB ist bei weitem nicht die einzige Sprache, die ein solches system nutzt.

...wenn mans recht überlegt, ist es schon etwas gruselig, aber wohl "tradition" im proceduralen...

Verfasst: 10.05.2006 17:20
von jear
Kaeru Gaman hat geschrieben:in diesem falle wurde sie durch das

Code: Alles auswählen

test = "Aufrufe : " 
definiert.
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 = "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
Shared könnte eine gute Möglichkeit sein, zwischen Globals und lokalen Variablen eine Klasse von Variablen zu definieren, die genau den gewünschten Wirkungsraum haben. Ist es aber jetzt leider nicht, sondern weder Fisch noch Fleisch!

Verfasst: 10.05.2006 18:25
von real
@jear: Stimmt, verdammt. Was ist das denn für ein Mist!?

Verfasst: 10.05.2006 19:29
von Kaeru Gaman
stimmt.

wenn man das durch

Code: Alles auswählen

test.s = "...
ersetzt, dann gehts.
ohne den typ ists nur ne zuweisung, recht hast du.

...witzig, dass das erst jetzt jemandem auffällt.

Verfasst: 10.05.2006 19:44
von MVXA
Darauf hab ich in meinem 1. Post in diesem Thread versucht
aufmerksam zu machen aber ihr führt hier gleich ne Seite
lange Diskussion über den Sinn... /:->