Klassen vs. TList

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

bruZard

Betreff: Klassen vs. TList

BeitragFr, Aug 05, 2005 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe da schon wieder mal eine Anfängerfrage (nein, für Beginner wäre sie dann doch zu hart Wink )

Ich suche nach einer Möglichkeit mit einer Funktionalität komplett in einer Klasse zu bleiben, anstatt ständig von aussen durch eine Funktion eingreifen zu müssen.

Beispiel:

Ich habe sehr oft (fast immer) mit dem Umstand zu kämpfen dass ich Listen in meinen KLassen verwende und diese die komplette Eigenschaftendefinition der Klasse benötigen.
Code: [AUSKLAPPEN]

Type TMyType
  Global list:TList
  Global count:Int

  Field id:Int
  Field x:Float
  Field y:Float

  Method New()
    If list:TList = NULL Then list:Tlist = New TList
    list.AddLast(Self)
  End Method
End Type

Der Zusatnd ist klar, ich habe eine Klasse mit drei Eigenschaften und erzeuge bei einem New automatisch ein neues Listenelement in list:TList. Diese Liste ist nun mit der Klasse verbunden und ich kann beliebig viele Instanzen dieser Klasse erzeugen. Aber ... ich kann die Liste nur von aussen über eine Funktion durchgehen.

Meine Frage nun:
Kennt jemand eine Möglichkeit diese Klasse innerhalb der Klasse per Methode oder interner Funktion zu durchforsten?
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

klepto2

BeitragFr, Aug 05, 2005 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hoffe das ich dich richtig verstanden habe:

Code: [AUSKLAPPEN]


Type TMyType
  Global list:TList
  Global count:Int

  Field id:Int
  Field x:Float
  Field y:Float

  Method New()
    If list:TList = Null Then list:Tlist = New TList
    list.AddLast(Self)
  End Method

  Method Iterate()
   If List <> Null Then
   For Local A:TMyType = EachIn List
      If A = Self Then Print "Type Found (Id : " + A.ID + " )"
   Next
   Else
      Print "List is empty !"
   EndIf
  End Method

End Type

Local A:TMyType = New TMytype
A.ID = 111


For Local I:Int = 1 To 100
   Local B:TMyType = New TMyType
   B.ID = I
Next

A.Iterate()

bruZard

BeitragSa, Aug 06, 2005 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
*Vor die Stirn klatsch*

Natürlich ... man sieht manchmal den Wald vor lauter Bäumen nicht.

Danke!
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

TheShadow

Moderator

BeitragSa, Aug 06, 2005 12:40
Antworten mit Zitat
Benutzer-Profile anzeigen
ich nehme immer dynamische arrays dafür... weil dann hat man immer einen "index"


Code: [AUSKLAPPEN]

Type test
   Field x:Int
   Global list:test[]

   Method New()
      list=list[..list.length+1]
      list[list.length-1]=Self
   EndMethod

   Method foo()
      For i=1 To list.length
         Print list[i-1].x
      Next
   EndMethod
EndType

test1:test=New test
test1.x=123

test2:test=New test
test2.x=456

test3:test=New test
test3.x=789

test3.foo()


PS: vorteil bei meinem code: irgendwelche IF's können entfallen - da eine FOR-Schleife mit 0-Elementen im List-Array nicht ausgeführt wird... quasi "selbstprüfendes" Codeteil.
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

Ava

Gast

BeitragSo, Aug 07, 2005 20:55
Antworten mit Zitat
+ wieder gelöscht, weil glaube ich Frage falsch verstanden +

Rolling Eyes

Fetze

BeitragMo, Aug 08, 2005 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
@TheShadow
Wie löschst du mit deiner Array-Methode ein beliebiges Element?

Jolinah

BeitragMo, Aug 08, 2005 9:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Indem er alle nachfolgenden Elemente nach vorne verschiebt und das hinterste auf Null setzt? Wink

Fetze

BeitragMo, Aug 08, 2005 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Alle? Hm, okay, dann ists ungeeignet für meine Zwecke. Hätte jetzt gedacht, man könnte das irgendwie abkürzen.
 

Serge

BeitragMo, Aug 08, 2005 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, bei sowas ist so nen Variables Array natürlich ein gutes Stück langsamer, insbesondere in Listen mit vielen Elementen.
Bei ner Tlist müssen nur die Pointer anders gesetzt werden und schon ist ein Element raus Smile
http://www.dark-matter-soft.de

Fetze

BeitragMo, Aug 08, 2005 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, man könnte auch einfach den zu löschenden Verweis mit dem letzten überschreiben und dann die Liste um 1 verkleinern. Sollte schneller sein, oder? Funktioniert einwandfrei, ich habs mal ausprobiert. Aber dann musste ich leider feststellen, dass mir das ganze an Geschwindigkeitsvorteil nur 5 FPS gebracht hat - bei 11000 Objekten. Der Zugriffsunterschied scheint bei großen Objektlisten wirklich mikroskopisch zu sein. Ich empfehle es jedem, der erwägt, seine Listen zwecks Speedoptimierung durch Arrays zu ersetzen: Um gottes Willen nur, wenn wenn es euch definitiv keine Nachteile bringt.

Jolinah

BeitragMo, Aug 08, 2005 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
So gehts natürlich auch Smile Manchmal kann es aber darauf ankommen dass die Ordnung erhalten bleibt. Da ist man mit ner linked list schon besser dran.

Hingegen bei Maps möchte ich nur ungern auf ein Array verzichten

Fetze

BeitragMo, Aug 08, 2005 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Maps sind ja auch sowas von statisch, dass es nichts schaden kann *g*
Vor allem, weil ma nda wiederum den "Random Access" braucht, die Möglichkeit, nicht alles durchgehen zu müssen, sondern jedes Element einzeln abrufen zu können. *erklärbär-für-newbies-spiel*

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group