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

Beitrag von MVXA »

falsch geraten...
Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

@real
sag ich ja :-)
1. Win10
PB6.1
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag 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.
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag 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.
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag 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!
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag 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!
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

@jear: Stimmt, verdammt. Was ist das denn für ein Mist!?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

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

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... /:->
Bild
Gesperrt