LinkedLists - "neues" Problem!

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Sebe

Betreff: LinkedLists - "neues" Problem!

BeitragDi, März 01, 2005 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink ):
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

BeitragDi, März 01, 2005 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 02, 2005 1:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 02, 2005 1:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Dann wäre es aber besser wenn du die Variable mit Null initialisierst statt ein neues Objekt anzulegen (was Speicher frisst).

DivineDominion

BeitragMi, März 02, 2005 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Jep, denn:

Code: [AUSKLAPPEN]
Local currentMenu:IGUImenu

For currentMenu = Eachin ...


funktioniert mindestens genausogut, wohl aber noch besser Smile Du brauchst das durch New erstellte Objekt schließlich nie. Und wehe, wenn du kein Flushmem nutzt, dann merkt man das auch irgendwann Smile
christian.tietze@gmail.com - https://christiantietze.de
macOS
 

Sebe

BeitragMi, März 02, 2005 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, März 03, 2005 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Keiner ne Idee? Wäre schade drum, ich hab heute nochmal min 45min den Code nach Fehlern durchsucht und finde einfach nichts Crying or Very sad

Jolinah

BeitragFr, März 04, 2005 1:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, März 04, 2005 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Mad
Ich werde jetzt auf jeden Fall in Zukunft darauf achten Wink

Nochmal danke!

Jolinah

BeitragFr, März 04, 2005 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 06, 2005 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das meinte ich nicht 8)
Ich meinte sozusagen "in einer Zeile".
Trotzdem danke Wink

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group