Types in Types finden....

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

EPS

Betreff: Types in Types finden....

BeitragDo, Okt 21, 2004 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich hab ein kleines Problem bei meinen Types...

also ich hab zwei verschachtelte Type Strukturen:

Type IButton
Field X,Y
End Type

Type IconLine
Field X,Y
Field IBut.IButton
End Type

IBut ist also ein Element in IconLine. Davor soll es mehrere geben. Jedes Element IconLine soll also gleichzeitig mehrere Elemente des Typs IButton enthalten können.

Das anlegen geht dann in etwa so:

ICL.IconLine = New IconLine
ICL\IBut = New IButton
.
.
.
ICL\IBut = New IButton
.
.
.

usw.

Nun zur Frage.

Wie muß eine Suchschleife konstruiert sein die mir alle IButton eines Elemementes IconLine durchsucht?

Ich hatte aussen folgende Schleife gemacht:

For ICL.Iconline = Each IconLine

und die innere Schleife dann mittels:

For ICL\IBut = Each IButton

...aber das funktioniert so nicht. Komischerweise werden alle IButton schon im ersten Element IconLine gefunden und nicht in dem in welchem sie sich befinden.

Das ganze ist etwas verstrickt und ich find mich bald gar nicht mehr raus Wink

Also im Forum fragen...vielen Dank schon mal
 

CodeMaster

BeitragDo, Okt 21, 2004 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Es funktioniert immer nur ein Type-Eintrag pro Type-Eintrag Very Happy
Du hast also pro IconLine-Element jeweils nur ein IButton-Element.
Die einzige Möglichkeit wäre, mehrere IButton-Elemente in die IconLine-Liste unter verschiedenen Namen zu definieren, oder per BlitzArray. Was anderes geht meines Wissens nach nicht.
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102
 

BIG BUG

BeitragDo, Okt 21, 2004 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mal eine Lösung:

Code: [AUSKLAPPEN]


Const TYPE_ENTRY    = 0
Const TYPE_INSTANCE = 1


SeedRnd MilliSecs()


Global Cnt_Instance

Type Frucht
   Field Typ; 0=Entry 1=Instance
            ; Könnte man auch in Name oder Gewicht verstecken
   Field Name$
   Field Gewicht
End Type

Type Baum
   Field Name$
   Field Frucht.Frucht
End Type


;Bäume erzeugen
abaum.baum = CreateBaum("Apfelbaum",    "Apfel")
bbaum.baum = CreateBaum("Birnbaum",     "Birne")
kbaum.baum = CreateBaum("Kirschbaum",   "Kirsche")
pbaum.baum = CreateBaum("Pflaumenbaum", "Pflaume")



;Früchte erzeugen
For b.baum = Each baum
   
   Anzahl = Rand(2,7)
   For i = 1 To Anzahl
      CreateFrucht(b,Rand(50,250))     
   Next

Next


;Früchte je Baum ausgeben

For b.baum = Each baum
   
   Print b\name$
   f.frucht = After b\frucht
 
   While f <> Null 
      If f\Typ = TYPE_INSTANCE Then Exit

      Print "  " + f\Name$ + "  " + f\Gewicht + "g"
      f.frucht = After f.frucht
   Wend

Next

WaitKey()

;Ende Hauptprogramm

Function CreateBaum.Baum(Baumname$, Fruchtname$)

   Local b.Baum

   b = New Baum

   b\Name$  = Baumname$
   b\Frucht = CreateFruchtInstance(Fruchtname$)
   Return b

End Function


Function CreateFruchtInstance.Frucht(Fruchtname$)

   Local f.Frucht

   f        = New Frucht
   f\typ    = TYPE_INSTANCE
   f\Name$  = Fruchtname$
   Return f

End Function


Function CreateFrucht.Frucht(Baum.Baum, Gewicht)

   Local f.Frucht
   Local h.Frucht

   If baum.baum = Null Return Null

   h = baum\frucht

   f         = New Frucht
   f\typ     = TYPE_ENTRY
   f\Name$   = h\name$
   f\Gewicht = Gewicht
   Insert f After baum\frucht

   Return f

End Function



Prinzip:
Es wird für jeden "Ober-Type" ein eigener Informations-Eintrag im "Unter-Type" angelegt, der entsprechend verlinkt wird.
Alle neuen Objekte werden dann direkt hinter dem entsprechenden InfoEintrag erzeugt. Über diesen Infoeintrag werden dann die einzelnen Instanzen direkt abgefragt.

Die manuelle Abarbeitung der Type-Einträge ist bei deaktiviertem Debugger übrigens nicht viel langsamer als eine For-Each-Schleife:
Code: [AUSKLAPPEN]


Type blup
   Field affe
End Type

For i = 1 To 1000000
   f.blup = New blup
Next

 
Print "Zeitmessung Manuell"
 
f.blup = First blup

oldtime = MilliSecs()
While f <> Null 
   If f\Affe = 5 Then Exit
   f.blup = After f.blup
Wend
Print MilliSecs() - oldtime


Print "Zeitmessung For-Each"

oldtime = MilliSecs()
For f.blup = Each blup

Next

Print MilliSecs() - oldtime

WaitKey()
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

EPS

BeitragDo, Okt 21, 2004 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank BIG BUG für den Vorschlag.

Ich hab es jetzt (wie CodeMaster vorgeschlagen hat) mit Hilfe eines BlitzArrays realisiert. Ist einfacher für mich da durchzusteigen.
 

walski

Ehemaliger Admin

BeitragDo, Okt 21, 2004 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Da diese Schleifendurchgänge wirklich nich sehr viel Zeit verschlingen hilft meistens ( natürlich nicht beim bis zum letzten FPS optimierten Spiel... ) auch ein:

Code: [AUSKLAPPEN]


Local tIButton.IButton

For ICL.Iconline = Each IconLine

 For tIButton = Each IButton
 
  If tIButton = ICL\IBut then

   ; Hier dein Code rein

  EndIf

 Next

Next


Das ganze liegt daran, dass Blitz leider nur pro Listen-Typ auch wirklich nur EINE Liste verwaltet und alle Instanzen in dieser Liste zu finden sind :S

XY.Z = New Z

fügt also nur ein neues Element zur globalen Liste Z, es erstellt nicht eine neue Liste vom Typ Z in der Variable XY Sad

Ist scheiße, aber nicht zu ändern.

walski
buh!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group