LinkedLists - "neues" Problem!
Übersicht BlitzMax, BlitzMax NG Allgemein
SebeBetreff: LinkedLists - "neues" Problem! |
Di, März 01, 2005 21:34 Antworten mit Zitat |
|
---|---|---|
So, ich wills kurz und präzise machen. Ich habe ein Type "geschrieben":
Code: [AUSKLAPPEN] Type IGUImenu Method draw() End Method End Type Es enthält nur die Methode "draw" die auch noch leer ist. Weiterhin habe ich folgende Funktion: Code: [AUSKLAPPEN] Function IGUI_setup() Global IGUI_menu_objects:TList = CreateList() End Function Also eine verkettete Liste, die die Menüobjekte aufnehmen soll. So, dann habe ich noch folgende Funktion: Code: [AUSKLAPPEN] Function IGUI_menu_update() Local current_menu:IGUImenu = New IGUImenu For current_menu = EachIn IGUI_menu_objects current_menu.draw Next End Function Die Funktion soll also jedesmal nach der Ausführung jedes Menü auf den Bildschirm zeichnen. So, nun mein Problem (nein, es lautet nicht: es wird nichts auf dem Bildschirm angezeigt ): Das alles soll später mal ein Modul werden. Leider bekomme ich beim Testbuild folgende Fehlermeldung: Zitat: Building Modules Compiling:system.bmx Compile Error:ForEach must be used with a string, array, or appropriate object Was mache ich falsch/muss ich richtig machen? Appropriate heisst doch passend, wieso funktionert das nicht? |
||
- Zuletzt bearbeitet von Sebe am Do, März 03, 2005 1:27, insgesamt einmal bearbeitet
DivineDominion |
Di, März 01, 2005 23:47 Antworten mit Zitat |
|
---|---|---|
Code: [AUSKLAPPEN] Function IGUI_setup()
Global IGUI_menu_objects:TList = CreateList() End Function Global muss nach außerhalb - so ist es, glaube ich, nur "statisch", der Wert ändert sich bei den einzelnen funktionsaufrufen nicht, aber außerhalb eben ansich nicht sichtbar... Außerdem hast du bereits eine Wertzuweisung vollzogen, was ich auch nicht verstehe: Code: [AUSKLAPPEN] Local current_menu:IGUImenu = New IGUImenu
Ansich reicht sowas hier: Code: [AUSKLAPPEN] For Local currentMenu:IGUImenu = Eachin IGUI_menu_objects
in der Liste muss natürlich auch noch was drin sein, aber das hauptptroblem wird sein, dass IGUI_menu_objects nicht existiert (außerhalb der funktion von oben) und deswegen, wohl weil du nicht "Strict" arbeitest und so kein compilererror kommt, eine neue Integer-Variable deklariert wird. Integer sind normalerweise nicht indizierbar, darum dann |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
Sebe |
Mi, März 02, 2005 1:04 Antworten mit Zitat |
|
---|---|---|
Zitat: Global muss nach außerhalb - so ist es, glaube ich, nur "statisch", der Wert ändert sich bei den einzelnen funktionsaufrufen nicht, aber außerhalb eben ansich nicht sichtbar... Jap, jetzt funktioniert es, danke! Zitat: Außerdem hast du bereits eine Wertzuweisung vollzogen, was ich auch nicht verstehe Das mache ich weil ich eine feste Struktur in meinen Quelltexten habe. Es gibt einen Teil wo die ganzen Variablen deklariert werden, einen Teil wo die Funktionen stehen etc. Aber nochmal: Danke Divine, aber eigentlich hätte ich auch selber darauf kommen können, dass man Globale Variablen/Typen nicht in einer Funktion deklariert (bin heute etwas durch den Wind, kA warum - normalerweise setze ich strict immer als erstes, komischer Tag heute :/)... |
||
Jolinah |
Mi, März 02, 2005 1:26 Antworten mit Zitat |
|
---|---|---|
Zitat: Das mache ich weil ich eine feste Struktur in meinen Quelltexten habe. Es gibt einen Teil wo die ganzen Variablen deklariert werden, einen Teil wo die Funktionen stehen etc.
Nur so als Tipp Dann wäre es aber besser wenn du die Variable mit Null initialisierst statt ein neues Objekt anzulegen (was Speicher frisst). |
||
DivineDominion |
Mi, März 02, 2005 10:11 Antworten mit Zitat |
|
---|---|---|
Jep, denn:
Code: [AUSKLAPPEN] Local currentMenu:IGUImenu
For currentMenu = Eachin ... funktioniert mindestens genausogut, wohl aber noch besser Du brauchst das durch New erstellte Objekt schließlich nie. Und wehe, wenn du kein Flushmem nutzt, dann merkt man das auch irgendwann |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
Sebe |
Mi, März 02, 2005 11:10 Antworten mit Zitat |
|
---|---|---|
So, ich hab jetzt alles nochmal neu gemacht und erhalte...
...naja, nicht direkt einen Fehler. Aber lest selbst.... Hier sind meine beiden Types: Code: [AUSKLAPPEN] 'Das "IGUI_menu_submenu" Objekt 'In ihm wird die Bezeichnung für 'das Untermenü gespeichert. Ausserdem 'speichert es die Einträge der Untermenüs 'als IGUI_menu_submenu_entry Objekte in 'verketteten Listen Type IGUI_menu_submenu 'submenu_id speichert die Bezeichnung Field submenu_id:String 'entrylist speichert alle Einträge vom 'Typ IGUI_menu_submenu_entry Field entrylist:TList = New TList 'Mit IGUI_menu_submenu.set_id([Bezeichnung]) 'wird die Bezeichnung zugewiesen Method set_id(wanted_id:String) submenu_id = wanted_id End Method 'IGUI_menu_submenu.give_list() gibt die 'verkettete Liste zurück Method give_list:TList() Return entrylist End Method 'IGUI_menu_submenu.give_id() gibt die 'Bezeichnung des jeweiligen Submenüs zurück Method give_id:String() Return submenu_id End Method 'Mit IGUI_menu_submenu.add_entry([Bezeichnung des Eintrags]) 'wird ein Eintrag zum Menu hinzugefügt und 'dem Eintrag eine Bezeichnung zugewiesen Method add_entry(entry_id:String) ListAddLast(entrylist, New IGUI_menu_submenu_entry.set_id(entry_id)) End Method 'IGUI_menu_submenu.count_entries() gibt die 'aktuelle Anzahl der Einträge in das Submenü 'zurück Method count_entries:Int() Return entrylist.count() - 1 End Method 'IGUI_menu_submenu.give_entry([Eintragsnummer]) 'gibt den Eintrag in Form von IGUI_menu_submenu_entry 'an der spezifischen Stelle zurück Method give_entry:Object(jumpto:Int) Return entrylist.valueatindex(jumpto) End Method End Type 'Das "IGUI_menu_submenu_entry" Objekt 'Es enthält lediglich die Bezeichnung, 'die der Programmierer ihm bei der 'Erstellung zuweist Type IGUI_menu_submenu_entry 'entry_id speichert die Bezeichnung Field entry_id:String 'IGUI_menu_submenu_entry.set_id([Bezeichnung]) 'wird die Bezeichnung zugewiesen Method set_id(wanted_id:String) entry_id = wanted_id End Method 'IGUI_menu_submenu_entry.give_id() gibt die 'Bezeichnung des jeweiligen Eintrags aus Method give_id:String() Return entry_id End Method End Type Um den Code zu testen habe ich folgendes kleines Programm geschrieben: Code: [AUSKLAPPEN] Strict Graphics(640,480, 0) Global test_submenu:IGUI_menu_submenu = New IGUI_menu_submenu Global submenu_counter:IGUI_menu_submenu_entry Global lineval:Int = 5 test_submenu.set_id("Mein tolles Menue") DrawText(test_submenu.give_id() + " erstellt!", 5, lineval) test_submenu.add_entry("Ich") test_submenu.add_entry("bin") test_submenu.add_entry("ein") test_submenu.add_entry("Eintrag") For submenu_counter = EachIn test_submenu.give_list() lineval:+15 DrawText(submenu_counter.give_id(), 5, lineval) Next While Not KeyHit(27) Flip() Wend EndGraphics Den String aus der IGUI_menu_submenu Instanz "test_submenu" bekomme ich auch noch einwandfrei angezeigt. Aber dort, wo eigentlich die Strings aus den IGUI_menu_submenu_entry Instanzen angezeigt werden sollten ist nicht. Nada. Nothing. Ich habe schon den ganzen Code durchwühlt und nichts gefunden, findet ihr den Fehler? |
||
Sebe |
Do, März 03, 2005 22:27 Antworten mit Zitat |
|
---|---|---|
Keiner ne Idee? Wäre schade drum, ich hab heute nochmal min 45min den Code nach Fehlern durchsucht und finde einfach nichts | ||
Jolinah |
Fr, März 04, 2005 1:11 Antworten mit Zitat |
|
---|---|---|
Zitat: ListAddLast(entrylist, New IGUI_menu_submenu_entry.set_id(entry_id))
So machst du zwar eine neue Instanz, du speicherst aber nicht die Instanz in die Liste sondern den Rückgabewert der set_id funktion dieser Instanz. Und die gibt bei dir nunmal nichts zurück, also sind nur leere Einträge in der Liste. Code: [AUSKLAPPEN] Local entry:IGUI_menu_submenu_entry = new IGUI_menu_submenu_entry entry.set_id(entry_id) ListAddLast(entrylist, entry) 'evtl. entry = null 'Referenzierung entfernen, so dass es nur noch eine Referenz auf das neu erzeugte Objekt gibt. 'Wobei das wahrscheinlich nicht nötig ist da es eine Lokale Variable ist. |
||
Sebe |
Fr, März 04, 2005 22:00 Antworten mit Zitat |
|
---|---|---|
Erstmal: Thx! Zwar in diesem Fall Jolinah aber auch allen anderen Usern dieses Forums die immer bereitwillig helfen.
Zum Problem: Schade das man das nicht Alles in einem Funktionsaufruf machen kann. Aber ich bin auch selber schuld, mal wieder zu wenig nachgedacht Ich werde jetzt auf jeden Fall in Zukunft darauf achten Nochmal danke! |
||
Jolinah |
Fr, März 04, 2005 22:12 Antworten mit Zitat |
|
---|---|---|
Du könntest natürlich eine Funktion schreiben die das erledigt und zusätzlich die neue Instanz zurück gibt:
Code: [AUSKLAPPEN] Type menu Field text:string Method set_id(tx:string) text = tx End Method Function Create:menu(tx:string) Local m:menu = new menu m.set_id(tx) Return m End Function End Type ListAddLast(entrylist, menu.Create("Hallo") ) |
||
Sebe |
So, März 06, 2005 22:29 Antworten mit Zitat |
|
---|---|---|
Das meinte ich nicht 8)
Ich meinte sozusagen "in einer Zeile". Trotzdem danke |
||
Übersicht BlitzMax, BlitzMax NG Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group