"Variable Viewer" immer leer?

Fragen und Bugreports zur PureBasic 4.0-Beta.
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 »

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

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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

Beitrag 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 ;-)
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 »

@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:
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
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag 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.
Optimismus ist ein Mangel an Information.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

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

Also ist Protected doch besser geeignet. Weil wenns eine globale gleichen
Namen gibt und ich weiß das nicht, knallts unnötiger weise :mrgreen:
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
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag 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.
Optimismus ist ein Mangel an Information.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

Code: Alles auswählen

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