Was ist der Unterschied zwischen GLOBAL und SHARED?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Code: Alles auswählen

xyz.l=5

Procedure a()
   Shared xyz.l
EndProcedure

Procedure b()
   Shared xyz.l
EndProcedure

Procedure c()
   xyz.s
EndProcedure

Procedure d()
  xyz.f
EndProcedure
xyz ist dieselbe Long im hauptprogramm, in a() und in b(). diese xyz ist in c() und d() unbekannt, hier wird eine lokale definiert, ein string in c() eine float in d().

shared bedeutet: "hallo, ich muss mal auf die variable des hauptprogramms zugreifen, obwohl die nich global is"
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

OK, das habe ich verstanden. Stimmt, NUL, ich wollte eigentlich Protected statt Shared schreiben. Danke auch dir kaeru! :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

Zu diesem Thema habe ich auch eine interessante Frage. :)

Nehmen wir mal an, ich habe einen Code mit ein paar Prozeduren und
einer lokalen Variable außerhalb der Prozeduren. 2 der Prozeduren
benötigen Zugriff auf die lokale Variable.

Was wäre der Vorteil, wenn ich - anstatt die lokale Variable global zu
setzen - die Prozeduren, die Zugriff auf die lokale Variable
benötigen mit dem "Shared"-Befehl den Zugriff ermögliche?
Benötigt die Variable bzw. die Methode dann vielleicht weniger Arbeitsspeicher?

Mfg DerProgger
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Methode

? meinst du Procedur? Methoden haben wir hier nicht, ist kein OOP


> Was wäre der Vorteil

die geSHAREDte variable ist nur in diesen Prozeduren bekannt - du kannst namenskonflikte mit variablen in Includierten Procedures ausschließen.

besonders (aber nicht ausschließlich) bei großen codemengen sind mögliche namenskonflikte das hauptargument gegen globale variablen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@DerProgger
In dem Beispiel wäre es sinnvoll, die Variablen an die 2 beiden Proceduren
als Parameter zu übergeben. Shared ist eher im Zusammenhang mit
Callbacks interessant!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Ich habe Shared eigendlich nie benutzt. Habe ein wenig getestet und weiss jetzt ich wie Shared anwenden kann.

Code: Alles auswählen

Global y ; Variable Global anlegen
x = 2 ; im Hauptprogramm verfügbar
y = 1 ; Überall verfügbar

Procedure a()
  Shared x.l ; Variable verbinden
  Shared z.s ; Variable verteilt anlegen / gab es vorher nicht
  Debug "Procedure a()"
  Debug "Var X: " + Str(x)
  Debug "Var Y: " + Str(y)
  Debug "Var Z: " + z
  x = 100
  y = 200
  z = "Hallo Welt"
EndProcedure

Procedure b()
  Debug "Procedure b()"
  Shared x.l ; Variable verbinden
  Protected y.l ; Variable ist Lokal
  Shared z.s ; Variable verbinden
  Debug "Var X: " + Str(x)
  Debug "Var Y: " + Str(y)
  Debug "Var Z: " + z
EndProcedure

a()
b()
Debug "Hauptprogramm"
Debug "Var X: " + Str(x)
Debug "Var Y: " + Str(y)
Debug "Var Z: " + z
FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

Vielen Dank Kaeru Gaman, ts-soft und mk-soft,

nun ist mir die Sache klarer geworden. :)

@Kaeru Gaman
Das Wort habe ich wohl schlecht gewählt.
Mit Methode ist die Vorgehensweise gemeint.

Mfg DerProgger
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

achso..

normalerweise wäre ich drauf gekommen, aber bei
> Benötigt die Variable bzw. die Methode dann vielleicht weniger Arbeitsspeicher?
dachte ich nun wirklich, du meinst mit Methode etwas, was wie eine Variable im computer liegt und Arbeitsspeicher braucht.

Shared sollte (vermute ich) ebenso speichersparsam sein wie Global,
da ja wirklich dieselbe variable angesprochen wird.

wenn du eine Variable als Argument an eine proc übergibst, wird eine
neue lokale var erzeugt, die kann ja auch ganz anders heißen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Shared sollte (vermute ich) ebenso speichersparsam sein wie Global,
Davon bin ich nicht so überzeugt. Lokale Variablen belegen nach verlassen
der Prozedure doch keinen Speicher mehr, abgesehen von mit Static
deklarierten. Für die Übergabe belegter Speicher wird doch beim Verlassen
der Prozedur auch freigegeben. Speicher für globale oder shared Variablen
wird jedoch nie freigegeben.
Ob ich jetzt richtig liege, hängt natürlich vom Compiler ab, ob der die
Speicherzuteilung für lokale Variablen zur Laufzeit erstellt, oder dieser bereits
bei der Compilierung erstellt wird. Das müßte aber jemand der ASM Gurus wissen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Für die Übergabe belegter Speicher wird doch beim Verlassen
der Prozedur auch freigegeben.

schön, aber während die procedur läuft, benötigt die variable dort speicher - plus den speicher, den die variable im hauptprogramm benötigt.
globale vars oder shared benötigen diesen speicher nur ein mal.

(wir reden nicht von werten, die man im funktionsaufruf berechnet, sondern über solche, die schon als variablen geführt werden, sonst wäre der vergleich mit 'global' gar nicht möglich)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten