Alle Variablen auf einmal "globalisieren"

Für allgemeine Fragen zur Programmierung mit PureBasic.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Alle Variablen auf einmal "globalisieren"

Beitrag von D4uS1 »

Ich habe hier einen Programmcode mit ziemlich vielen Vairablen. Diese möchte ich jetzt fast alle in eine Prozedur einbauen. Nun müsste ich vor alle Variablen shared, oder global setzen. Gibt es eine Möglichkeit dem Compiler zu sagen, das einfach alle Variablen überall benutzt werden können?
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Nein.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du bist auf dem falschen Weg, konzipiere komplett um.
das, was du jetzt an arbeit vermeidest, kommt später tausendfach auf dich zu.
nichts ist tödlicher, als ein projekt, wo alle verdammten variablen global sind.
stop hier, denk um, oder es wird weh tun.
...ein wohlgemeinter rat aus eigener erfahrung.... (wir alle waren mal rookies)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

ok, nur eine Frage noch, was genau ist denn der Unterschied zwischen globalen Variablen und normalen, abgesehen davon das man die einen überall verwenden kann?
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

Am besten du erstellst einen Kontext für deine Applikation.

Also am Anfang des Codes eine Struktur, welche alle nötigen Variablen enthält:

Code: Alles auswählen

Structure APPLICATIONCONTEXT
  hwnd.l
  xyz.b
  ping.l
  dingsDa.b
  *pAdresse
  ... 
  ... usw
  ..
  .
EndStructure

Procedure InitApp(*ctx.APPLICATIONCONTEXT, var1.l, var2.b, *pointer)
  *ctx\ping = var1
  *ctx\dingsDa = var2
  *ctx\pAdresse = *pointer
EndProcedure

Beim initialisieren der Applikation kannst du diese Struktur im Speicher erstellen und später all deinen Prozeduren diesen Kontext und dessen Inhalt via Parameter verpassen.

Code: Alles auswählen

*ctx.APPLICATIONCONTEXT = AllocateMemory(SizeOf(APPLICATIONCONTEXT))

InitApp(*ctx, 10, 20, 60)
Vorteil: Du hast einen Pointer der alles eingekapselt enthält auf dessen Inhalt du in allen Bereichen zugreifen kannst solange die Adresse des Kontextes übergeben wird.

Und wenn du z.B. sodann deine Applikation re-initialisieren willst, musst du nicht wie bei Globalen alle einzeln auf 0 oder den defuault Wert setzen, sondern kannst das mit der Struktur an der Adresse blitzschnell lösen:

Code: Alles auswählen

CopyMemory(*AdressOfDefaultsStorage, *ctx)

oder alles wieder auf Zero zurück: 

For i = 0 to SizeOf(APPLICATIONCONTEXT)-1
  PokeB(*ctx, 0)
Next i

PS: Normale Variablen sind lokal, bedeutet auf sie kann lediglich im aktuellen Gültigkeitsbereich zugegriffen werden.

Code: Alles auswählen

local.l = 10

Procedure Function(....)
  local = 20
EndProcedure  

debug local
... wird 10 rauskommen, da die Procedure Function einen eigenen Gültigkeitsbereich hat.
http://www.purearea.net/pb/german/index.htm und dort unter "Prozeduren Unterstützung" die Links ansehen.

Wenn du also mit einer Melanie aus Hausnummmer 54 (die Prozedur) welche Hausarrest (local) hat rum fummelst, bedeutet es eben noch nicht, dass alle Melanies in allen anderen Häusern der Strasse etwas mit dir erlebt haben nur weil sie Melanie heissen. Die Häuser sind also die Gültigkeitsbereiche.

Wenn aber nun eine Melanie die globale Melanie der Strasse ohne Konkurrenz ist und keinen Hausarrest (global) hat und du mit ihr rum fummelst, dann kann sie in alle anderen Häuser (Prozeduren) zum Kaffeeklatsch gebeten werden und erzählen wie du an ihr rum gefummelt hast.
Hier gibts die OOP Option für PureBasic.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ein anderes gutes Beispiel: Stell Dir einfach vor, in einer 500-Mann-Firma hat jeder Mitarbeiter Zugriff auf den Schlüsselschrank... wäre etwas chaotisch ;)

Globale Variablen sehen zunächst viel geiler aus, klar, wozu auch eingrenzen. Aber das hängt immer mit der Größe eines Projekts ab. Wenn in einer 5-Mann-Firma jeder an die Schlüssel darf, ist das sicher auch nicht so ein großes Problem ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
IceFish
Beiträge: 10
Registriert: 02.01.2008 02:47

Beitrag von IceFish »

Was hierbei auch eine sehr nette Methode ist: Protected <variable>

Das Bedeutet, das du innerhalb eine Function/Procedure den Varieblen Namen geben kannst, die du vllt zZ oder später als 'Global' deffiniert hast.

Code: Alles auswählen

Global var.b

Procedure Function()
 Protected var.s
 var = "Hello World!"
EndProcedure 
Das finde ich nämlich eine sehr schöne Möglichkeit.
Antworten