angehängte Types

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

StarGazer

Betreff: angehängte Types

BeitragDi, Nov 15, 2005 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich schreibe hier rein, denn ich denke daß es keine Beginnerfrage ist, und bei der Suche danach habe ich leider nichts gefunden.


Ich möchte gern Types mit Listen erstellen, wobei ich aber vorher nie weis wie groß diese werden würden, also geht es nicht mit Typ\List[i]

Ich habe gesehen das man angehängte Types machen kann, doch leider scheint es nicht richtig zu klappen.

Hier ein kleines Beisspiel wie ich es versucht habe

Code: [AUSKLAPPEN]

Type papier
   Field papiermenge
End Type

Type fabrik
   Field preis
   Field papier.papier
End Type


fabrik1.fabrik = New fabrik
fabrik1\preis  = 100
fabrik1\papier = New papier
fabrik1\papier\papiermenge=50
fabrik1\papier = New papier
fabrik1\papier\papiermenge=50
fabrik1\papier = New papier
fabrik1\papier\papiermenge=50


fabrik2.fabrik = New fabrik
fabrik2\preis  = 100
fabrik2\papier = New papier
fabrik2\papier\papiermenge=50
fabrik2\papier = New papier
fabrik2\papier\papiermenge=50
fabrik2\papier = New papier
fabrik2\papier\papiermenge=50


;-----------------------------
; nun möchte ich nur die Daten aus der Fabrik 1 herrauslesen

bestelltpreis = fabrik1\preis

;For fabrik1\papier.papier = Each fabrik   ; geht garnicht
;For fabrik1\papier.fabrik = Each fabrik   ; geht garnicht
;For fabrik1\papier.papier = Each papier ; kommt das selbe herraus

For fabrik1\papier.fabrik = Each papier
   menge = menge + fabrik1\papier\papiermenge
Next
;-----------------------------

Print "Menge         : "+menge

bestelltpreis = bestelltpreis * menge
Print "Bestelltpreis : "+bestelltpreis


While Not KeyDown(1)
Wend
End


Ich erste da 2 Type Farbiken, dehnen ich mehrfach Werte zuweise.
Nacher möchte ich aber nur aus der ersten Fabrik, die Werte aus dessen Liste herauslesen.
Das geht leider nicht, den es scheint das es keine Listen von den Types sind, sonden nur eine eigene große, und wenn ich es dann mit der Forschleife herrauslese, geht er alle Papierlisten durch, dabei möchte ch doch nur die Papierliste der Fabrik1 auslesen.

Daher müste die Menge 150 betragen und nicht 300
und der Bestelltpreis 15000 anstatt 30000
aber da er alle Papierlsten durchgeht, kommt immer das doppelte herraus


Weis jemand da eine Lösung ? geht das denn überhaupt ?
Wenn nicht, machen diese angehängten Types ja überhauptkeinen Sin.
 

BIG BUG

BeitragDi, Nov 15, 2005 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Types lassen sich so nicht schachteln. Es gibt aber ein paar Workarounds, eine Variante wäre diese hier:

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)

StarGazer

BeitragFr, Nov 18, 2005 13:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für deine Anwort.
Ich werde mir dein Beispiel genau anschauen, so auf den ersten Blick begreife ich nicht allzu viel Smile Ist recht komlpex.

Schade das BBasic das von sich aus nicht kann, noch ein kleines Manko Sad
Aber naja, super ist BB allemal.
Danke nochmals.

Hip Teen

BeitragFr, Nov 18, 2005 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
doch, das kann man ganz einfach schachteln. Bei deiner For each Schleife muss folgendes stehen:

BlitzBasic: [AUSKLAPPEN]

For fabrik1\papier = Each papier
;alles mögliche Abfragen
Next


So klappts auch mit den Typs Wink
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger"

Ctuchik

BeitragFr, Nov 18, 2005 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
@Hip Teen: Nein, dann kriegt er wie er schon sagte alle Papiere und nicht nur die von Fabrik 1.

Möglich wäre es zum Beispiel auch so:
Code: [AUSKLAPPEN]
Type fabrik
  Field papier.papier
  Field preis
End Type

Type papier
  Field menge
  Field fabrik.fabrik
End Type

fabrik1.fabrik = New fabrik
fabrik1\preis  = 100
p.papier = New papier
p\menge=10
p\fabrik = fabrik1
p = New papier
p\menge=10
p\fabrik = fabrik1
p = New papier
p\menge=10
p\fabrik = fabrik1

fabrik2.fabrik = New fabrik
fabrik2\preis  = 200
p = New papier
p\menge=10
p\fabrik = fabrik2
p = New papier
p\menge=12
p\fabrik = fabrik2
p = New papier
p\menge=15
p\fabrik = fabrik2

bestelltpreis = fabrik1\preis

For p.papier = Each papier
  If (p\fabrik = fabrik1) Then
    menge = menge + p\menge
  End If
Next

bestelltpreis = bestelltpreis * menge
Print "Bestelltpreis : "+bestelltpreis

WaitKey()
End


MfG Ctuchik
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!
 

Stephan

BeitragDi, Aug 22, 2006 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist sehr interessant, ich habe auch schon öfter versucht dieses Prob zu lösen, nur wurde ich damals in den Beiträgen immer falsch verstanden *g*.

Mich würde allerdings mal interessieren ob sich diese Problematik in BlitzMax oder C++ eleganter angehen lässt.

Vlei könnte man dann eine Userlib oder so schreiben.

Jolinah

BeitragDi, Aug 22, 2006 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Mich würde allerdings mal interessieren ob sich diese Problematik in BlitzMax oder C++ eleganter angehen lässt.

In BlitzMax und C++ kann man so viele unabhängige Listen erstellen wie man will. Dort funktioniert dann auch die anfangs gewünschte Verschachtelung. Das Problem bei BB ist halt dass alles immer bei der selben Liste hinzugefügt wird (pro Type 1 Liste).

In BlitzMax kann also das Each auf mehrere einzelne Listen angewendet werden:
Code: [AUSKLAPPEN]
Type Fabrik
  Field papier:TList

  Method New()
    papier = new TList   'Neue Liste pro Objekt erstellen
  End Method
End Type

Type Papier
  Field menge:Int
End Type

Local f1:Fabrik = new Fabrik
Local p:Papier = new Papier
p.Menge = 20
f1.papier.AddLast(p)  'p der papier-Liste hinzufügen
f1.papier.AddLast(p)  'noch eine zweite Referenz hinzufügen

Local f2:Fabrik = new Fabrik
p = new Papier
p.Menge = 30
f2.papier.AddLast(p)
f2.papier.AddLast(p)

'Jedes papier-Objekt der Liste in f1 durchgehen
For p = EachIn f1.papier
  Print p.menge
Next

'Jedes papier-Objekt der Liste in f2 durchgehen
For p = EachIn f2.papier
  Print p.menge
Next

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group