Globale Variablen in einer Funktion werden nicht erkannt?
Übersicht

![]() |
M0rgensternBetreff: Globale Variablen in einer Funktion werden nicht erkannt? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute.
Ich hab ein kleines Problem bei BMax. Undzwar: Ich bin gerade dabei einen TileMapEditor zu schreiben und nutze dafür meine GUI. Ich will jetzt aber nicht vor der Hauptschleife tausende Buttons deklarieren. Das sieht unschön aus finde ich. Deshalb hab ich einfach ne Funktion geschrieben, in die ich das packe und die einfach hinter der Hauptschleife steht. Die Funktion wird dann vor der Hauptschleife aufgerufen. Das Problem: Wenn ich das so mache, und dann einzelne Buttons überprüfen will (ob sie angeklickt wurden), dann erkennt er die dazugehörige Variable nicht. Ich bekomme dann an entsprechender Stelle (da wo ich die Buttonvariable an eine entsprechende Funktion überge) die Meldung Identifier "Variable" not found. Wenn ich die FUnktion auskommentiere und den unschönen weg nehme, also alles vor die Hautpschleife setze, dann funktioniert es super. Variablen sind auch alle global. Jetzt meine Frage: Warum funktioniert das nicht? Werden Variablen, die in einer Funktion global deklariert werden im Hauptprogramm nicht als global erkannt? Hier noch der Code der Funktion: BlitzMax: [AUSKLAPPEN] Function InitGui() Wäre super, wenn jemand was wüsste. Lg, M0rgenstern |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die globale Deklaration bezieht sich in diesem Fall auf die Funktion, d.h. die Variablen bleiben zwischen zwei Funktionsaufrufen erhalten, sind ausserhalb jedoch nicht verfügbar.
Du könntest das ganze in einem Type speichern und die einzelnen Typevariablen ansprechen. Schöne Programmierung wäre dennoch anders. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie meinst du das mit in einem Type abspeichern?
Die stecken ja schon in nem Type (TGuiElement). Wie wäre denn schöne Programmierung? Lg, M0rgenstern |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich meinte sowas:
Code: [AUSKLAPPEN] type TMyAppGui
field menubutton:tGuiElement field nochnbutton:Tguielement method new() menubutton = TGuiElement.Create(bla,blub) nochnbutton = TGuiElement.Create(foo,bar) end method end type global MAG:TMyAppGui = new TMyAppGUI if MAG.menubutton.check() = .... |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Achso... Naja, das wär ja relativ unschön. Dann müsste man tausende Felder haben^^
Dann kommt halt alles vor die Hauptschleife. Lg, M0rgenstern |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
M0rgenstern hat Folgendes geschrieben: Naja, das wär ja relativ unschön. Dann müsste man tausende Felder haben
Genauso wird's aber i.d.R. bei OOP gemacht. Ich persönlich finde die Variante mit den Deklarationen vor der Hauptschleife um einiges unschöner. Das ist evtl. Geschmackssache, vielleicht auch nicht, hängt aber u.U. auch damit zusammen, wie lange man mit BMax programmiert (oder auch nicht) und wahrscheinlich (muss aber nicht sein) auch damit, wie ausgiebig man die OOP-Fähigkeiten BMax' in Gebrauch nimmt. Respektive: Mag zwar verschiedene Geschmäcker geben, aber es ist definitiv OOP-Standard ![]() mfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es kann doch nicht OOP Standard sein, dass man einen Type erstellt, der ein Field für JEDEN Button hat.
Bzw, das kann schon sein, aber kommt mich... seltsam vor. Lg, M0rgenstern |
||
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wieso soll es nicht OOP-Standard sein? In einigen Aspekten von OOP hantiert man mit Dingen, die erstmal komisch wirken. ![]() Man gewöhnt sich schnell daran, dass man das so schreibt. Die Vorteile sind die Kapselung und Wiederverwendbarkeit, wie man sie mit OOP ja erreichen möchte. Du hast deine GUI gekapselt und kannst sie so unabhängig von deinen Algorithmen verwenden. Wenn du später eine andere GUI nutzen möchtest (wxMax oder auch MaxGUI), dann kannst du (im Prinzip) das Interface (die Methoden/Funktionen, mit denen deine Algorithmen mit der GUI kommunizieren) gleich bleiben lassen (also die Handhabung der Funktionen/Methoden) und einfach den Inhalt auf die neue GUI anpassen. Mal nebenbei: Hast du mal mit Delphi gearbeitet? |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, mit Delphi arbeiten wir in der SChule, warum?
Wenn man so über diese Lösung nachdenkt, dann ist sie doch flexibler... Werd mal schauen ob ich das umschreibe. Lg, M0rgenstern. Vielen Dank. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was ich mit schönem Code meinte wäre der Ansatz den Type sich selbst verwalten zu lassen, d.h. in einer internen Liste alle Gadgets zu führen und diese dann eventbasiert reagieren zu lassen. Vieles lässt sich mit intelligentem Design lösen. Der Type als solches wäre wie schon erwähnt die klassische Datenkapselung der OOP. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ Bladerunner: Wenn die Types sich selbst verwalten, dann würde das ganze ja über Funktionspointer laufen, oder?
Da muss ich ehrlich sagen, da hab ich mich nicht rangetraut. Lg, M0rgenstern |
||
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Funktionspointer sind an sich ganz einfach. Hier ein einfaches Beispiel:
BlitzMax: [AUSKLAPPEN] SuperStrict Ich hoffe, damit leuchtet dir das ein. Zu beachten sind an sich ja drei Dinge: 1.: Bei der Deklaration müssen Rückgabetyp und die Parametertypen bekannt sein. 2.: Bei der Zuweisung arbeitet man wie mit Variablen. 3.: Der Pointer kann später dann ganz einfach wie eine Funktion behandelt werden. Viel Spaß in dieser wundersamen Welt. ![]() |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm
Also, ich glaube, ich fange an das zu verstehen. Aber ganz bin ich noch nicht durchgestiegen. Mal am Beispiel eines Types: BlitzMax: [AUSKLAPPEN] Type TButton Und wenn ich dann die Funktion zuweisen will, dann muss ich diese aber außerhalb des Types schreiben, also: BlitzMax: [AUSKLAPPEN] Function FileExists:Int(TStream(MeineDatei)) Hab ich das richtig verstanden? Lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was hindert dich dran, die Funktion in der Create-Funktion zu zu weisen? | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nichts, das war nur um das ganze zu verdeutlichen.
Wollte ja nur wissen, ob das richtig so ist. Dazu noch eine Frage: Wenn ich das ganze so schreibe: BlitzMax: [AUSKLAPPEN] Function FileExists:Int(TStream(MeineDatei)) Dann muss ich "MeineDatei" ja nicht mehr in der Funktion selbst Casten, oder? Lg, M0rgenstern |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group