Seite 2 von 2

Verfasst: 25.12.2006 17:23
von ts-soft
>> dann kannst du sie per Define vordefinieren, und zwar in jedem geltungskreis extra,
Wobei Define in Proceduren keinen Sinn macht (gleichnamige Globale Variablen werden überschrieben) und Protected die bessere
Wahl ist.

// Nachtrag:
scheint geändert worden zu sein, ups

Verfasst: 25.12.2006 17:44
von Kaeru Gaman
hu?

wenn du eine einfache locale variable benutzen willst,
brauchst du im procedurenkopf ein Define, was ja eigentlich auch absolout logisch ist.
ich sprach weder von Global noch von Protected.

Code: Alles auswählen

EnableExplicit

Define n

Procedure Count()
  Define n
  For n=0 To 7
    Debug "inner: "+Str(n)
  Next
EndProcedure

For n=0 To 7
  Debug "outer: "+Str(n)
  Count()
Next
die ausgabe sollte deutlich machen, dass es sich um zwei getrennte locale variablen handelt.

versuch mal in diesem code eines der beiden Defines auszukommentieren...

Verfasst: 25.12.2006 18:09
von Jet1199
danke für die Zusatztipps,

ich geha davon aus, daß global vereinbarte Variablen Projektweit gültig sind, auch in anderen Teilen als dem aktuellen Schnipsel. Was spricht dagegen, diese generell zu nehmen? Nur Ressourcen?

Ich habe kein Problem mit der Explicit-Vereinbarung, hatte ich ja in anderen Sprachen auch schon, eher erfreulich, daß man hier schneller zur Sache kommen kann. Aber ich bin gern bereit von alten Hasen zu lernen, noch dazu wenn diese sich mir gegenüber bemühen ;-)

Verfasst: 25.12.2006 18:14
von ts-soft
@Kaeru
Jetzt entspricht Define in Proceduren anscheinend dem Protected.
Das war nicht von Anfang an so, deshalb war ich beim Test verdutzt :mrgreen:

// Edit
>> ich geha davon aus, daß global vereinbarte Variablen Projektweit gültig sind
Genau dadurch können die Fehler entstehen. Diese Variablen können von
überall geändert werden und enthalten evtl. garnicht den erwarteten Wert.

Alle Variablen, deren Gültigkeit nicht Projektweit erforderlich ist, sollte man
auch nicht Global deklarieren. Es ist immer besser weitgehend auf globale
Variablen zu verzichten, besser als Parameter übergeben, so das sie auch in
den entsprechenden Proceduren benutzbar sind.

Bei kleineren Projekten wird man Fehler noch vermeiden können, aber mit
zunahme an Programmzeilen wirds immer schwieriger :wink:

Verfasst: 25.12.2006 19:11
von Hellhound66
Nicht zuletzt brauchts auch einfach weniger Speicher, wenn ich mit lokalen Variablen arbeite, vor allem wenn es größere Strukturen sind. Des weiteren finde ich es verwirrend, wenn ich für jede Prozedur, die eigentlich mit lokalen Variablen auskommen würde, globale nutzen würde. Um da ne Übersicht zu halten, müsste ich die Namensgebung wiederum an die Prozeduren anpassen und dann kann ich sie gleich in die Prozedur als lokale Variablen packen. Ich kommen in der Regeln mit <10 globalen Variablen aus.

Verfasst: 26.12.2006 01:59
von Kaeru Gaman
ts-soft hat geschrieben:Jetzt entspricht Define in Proceduren anscheinend dem Protected.
Das war nicht von Anfang an so, deshalb war ich beim Test verdutzt :mrgreen:
das hast du falsch aufgefasst.

Protected brauchst du, wenn du in einer Procedure einen Variablennamen als Local verwenden willst, der Global genutzt wird.
das kannst du nicht durch define ersetzen.

Code: Alles auswählen

Global test

Procedure gehts(plus)
  Protected test
  test + plus
  Debug "inner:"+Str(test)
EndProcedure

test +2
Debug "outer:"+Str(test)
gehts(4)
Debug "outer:"+Str(test)
<- das ist die verwendung von Global/Protected.
versuche, das Protected durch Define zu ersetzen, das gibt nen fehler.

Define dient dazu, eine Variable explizit zu definieren wie von EnableExplicit gefordert,
wenn sie nicht Global, Shared, Protected oder Static sein soll,
also eben eine stinknormale Locale Variable, die man garnicht explizit definieren würde,
wenn man nicht EnableExplicit benutzt.

Verfasst: 26.12.2006 02:04
von ts-soft
Also ist Protected doch besser geeignet. Weil wenns eine globale gleichen
Namen gibt und ich weiß das nicht, knallts unnötiger weise :mrgreen:

Verfasst: 26.12.2006 02:06
von Hellhound66
Was auch gut sein kann, damit ich weiss, dass es noch so eine globale Variable gibt, die ich vielleicht in der Prozedur gebraucht habe, aber mit der lokalen unwissentlich überschrieben habe.

Verfasst: 26.12.2006 11:53
von AND51
Jet1199 hat geschrieben:Mein Miniprogramm ist also um zwei Zeilen gewachsen:

Code: Alles auswählen


MessageRequester("Beispiel","a: "+Str(a)+"  b: "+Str(b)+"  a+b="+Str(a+b))
Du kannst seit PB 4 direkt beim deklarieren der Variablen Werte zuweisen:

Code: Alles auswählen

Global a.l=1
Global b.l=2
So sparste dir wieder etwas Schreibarbeit :D

Verfasst: 26.12.2006 21:00
von a14xerus

Code: Alles auswählen

Global a.l=1, b.l=2
:lol: