angehängte Types
Übersicht

![]() |
StarGazerBetreff: angehängte Types |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen Dank für deine Anwort.
Ich werde mir dein Beispiel genau anschauen, so auf den ersten Blick begreife ich nicht allzu viel ![]() Schade das BBasic das von sich aus nicht kann, noch ein kleines Manko ![]() Aber naja, super ist BB allemal. Danke nochmals. |
||
![]() |
Hip Teen |
![]() Antworten mit Zitat ![]() |
---|---|---|
doch, das kann man ganz einfach schachteln. Bei deiner For each Schleife muss folgendes stehen:
BlitzBasic: [AUSKLAPPEN]
So klappts auch mit den Typs ![]() |
||
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger" |
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group