error : variable is not explicitly defined

Previous topic - Next topic

UserWithoutGLBasic

Ich habe das Codebeispiel aus der Hilfe zum Befehl "DimDel" ins Code-Fenster kopiert um es auszuprobieren und erhalte die Meldung

Quote
_______________________________________
*** Configuration: WIN32 ***
precompiling:
GPC - GLBasic Precompiler V.9.829 SN:da879241 - 2D, WIN32
"testprojekt.gbas"(3) error : variable is not explicitly defined : star

Das Verrückte ist: die Fehlermeldung bezieht sich auf die Dim-Anweisung.

Nun habe ich das gleiche Listing aus dem Samples-Ordner "dimdel.gbap" gefunden und verglichen: es ist Byte für Byte das selbe Listing - dennoch läuft das Beispielprojekt aus dem Ordner - das Listing aus der Hilfe aber nicht.

Kann mir jemand erklären wieso?
Muss man noch irgendwas Verstecktes voreinstellen bevor man ein Programm überhaupt laufen lassen kann?

kanonet

Zwei Möglichkeiten es zu beheben:
1. unter Projekt->Optionen: Explizite Deklaration deaktivieren.
2. LOCAL star[] vor DIM einfügen.

Ich empfehle das zweite. Hintergrund ist, dass GLB dich so zwingt alle Variablen zu definieren, bevor du sie nutzen kannst, auf diese Weise fallen dir Tippfehler in Variablennamen schnell auf. In kleinen Testprojekten vielleicht lästig, aber in großen Projekten sehr nützlich!
Einige Codebeispiele sind so alt, dass es die explizite Deklaration damals noch nicht gab, leider wurde einige Beispiele seit dem nicht überarbeitet, daher taucht dieses Problem häufiger auf bei Neulingen/Umsteigern auf (siehe Forums Suche).
Ein neu erstelltes Projekt hat glaube ich standardmäßig immer explizite Deklaration aktiviert.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

UserWithoutGLBasic

Ich bin davon ausgegangen das eine Dim-Anweisung eigentlich eine Variablen-Deklaration sei - das man die Variablen zusätzlich Local, Global oder Static festlegen kann ist zwar klar und ich hab es bereits einfach mit Global Star[0][1] versucht - natürlich erfolglos...

Dennoch verwirrend das ein per DIM erstellter Array nicht als deklariert anerkannt wird und man das zunächst noch mit einfachen leeren Klammern angeben muss. Jetzt hab ich es so gemacht:
Code (glbasic) Select

Local star[]
Dim star[0][1]

dann geht es mit der nächsten Variable weiter (error: mousedown ist nicht deklariert)- da hab ich das Häkchen bei den Optionen entfernt weil ich jetzt nicht alles durchgehen und überall ein Global oder Local davor setzen will - dann läuft es zwar - aber das Beispiel funktioniert nicht - d.h. ich kann keine Sternchen mehr ins Bild klicken  :S

- mach ich das Local star[] weg, geht's wieder.

Scripts in ein und derselben Sprache abhängig von der Variablendeklarationsoption nicht mal untereinander kompatibel? Ja was soll das denn? Da sollten Variablendeklarationen lieber generell erforderlich sein und die Option abgeschafft werden, bevor man je nach Schaltung einen anderen "Dialekt" lernen/verwenden muss.
 

kanonet

DIM deklariert keine Variable, dass muss vorher geschehen.
Ist eine Variable nicht deklariert wird sie als GLOBAL erstellt. Da wir LOCAL genutzt haben, haben wir also den Code verändert, du müsstest GLOBAL verwenden um den gleichen Effekt zu erzielen. Meine Empfehlung für LOCAL war eher allgemeiner Natur, bezog sich nicht auf das konkrete Beispiel. Meist reicht LOCAL (und sollte wenn möglich auch bevorzugt werden), hier jedoch wird star[] im Hauptprogramm und in den FUNCTIONs verwendet und muss GLOBAL sein.

Natürlich führt gleicher Code immer zu gleichem Ergebnis, lag eben an uns: ;) Übrigens ist GLB keine Skriptsprache, sondern kompiliert zu richtigem Maschinencode.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64