"verschachtelte Types"

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

ShadowJumper

Betreff: "verschachtelte Types"

BeitragFr, Mai 23, 2008 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab ein Problem mit dem Aufruf von Types untergeordneten Types (also wenn ein Feld eines Types ein Type ist)

am Besten lässt sich das vlt. noch an einem Beispiel erkennen...



Code: [AUSKLAPPEN]

Type typea
    Field integer
End Type

Type typeb
    Field integer
   Field typea.typea
End Type

Type typec
    Field integer
   Field typeb.typeb
End Type


typec.typec = New typec
typec\integer = 1
typec.typec = New typec
typec\integer = 6
typec\typeb.typeb = New typeb
typec\typeb\integer = 2
typec\typeb.typeb = New typeb
typec\typeb\integer = 5
typec\typeb\typea.typea = New typea
typec\typeb\typea\integer = 3
typec\typeb\typea.typea = New typea
typec\typeb\typea\integer = 4

;besonders diese beiden Werte sind zu beachten, denn eigentlich sollte sie nicht ausgegeben werden...
typeb.typeb = New typeb
typeb\integer = 7
typea.typea = New typea
typea\integer = 8

For typec.typec = Each typec
   Write typec\integer+" "
Next

Print ""
Print "-"

For typec.typec = Each typec
   For typec\typeb.typeb = Each typeb
      Write typec\typeb\integer+" "
   Next
   Print ""
Next

Print "-"

For typec.typec = Each typec
   For typec\typeb.typeb = Each typeb
      For typec\typeb\typea.typea = Each typea
         Write typec\typeb\typea\integer+" "
      Next
      Print ""
   Next
   Print "x"
Next

Delay 12000

dieses Programm läuft zwar richtig, aber dennoch nicht wie gewollt
man will unter
Code: [AUSKLAPPEN]
For typec\typeb\typea.typea = Each typea

nur die "typea"'s durchgehen, die unter "typec\typeb" sind

es ist aber nicht möglich stattdessen "For typec\typeb\typea.typea = Each typec\typeb\typea", weil dadurch ein Compiletimererror auftritt

man kann zwar auf eine etwas mühsamere Art mit Before und After alle Einträge durchgehen, aber geht es denn nicht einfacher?


ich danke schon im vorraus für Antworten =)

ShadowJumper
Bilder kostenlos hosten
lest und weint:
RAM - 512 MB; GrafikRAM - 32 MB; CPU - 800 MHz
Ps: ... und weint (vor lachen)

Noobody

BeitragFr, Mai 23, 2008 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
So wie du das schreibst, geht es nicht.
Und zwar macht man gerne mal einen Denkfehler, wenn Typename und dessen Containervariable gleich heissen.
Mal ein kleiner Beispiel - Code: [AUSKLAPPEN]
 Type TypeA
    Field Integer
End Type

Type TypeB
    Field Child.TypeA
End Type

Type TypeC
    Field Node.TypeB
End Type


Würde man nun versuchen, alle TypeAs durchzugehen, die in TypeB enthalten sind (was ja ist, was du willst, so wie ich es verstanden habe), wäre folgender Code ziemlich unsinnig, wie nun zu erkennen ist:
Code: [AUSKLAPPEN]
 For Blab\Node\Child = Each Blab\Node\Child

- was ja auch logisch ist. Darum funktioniert dein Weg auch nicht.

Richtig wäre (nach meiner Interpretation deines Problems):
Code: [AUSKLAPPEN]
 For Container.TypeB = Each TypeB
    Print TypeB\TypeA\Dein_gewünschtes_Feld
Next


So geht man alle TypeAs durch, die in TypeB enthalten sind.
Ausserdem ist es vermutlich nicht gewünscht, in der Containervariable die Schleifenvariable zu speichern - dafür solltest du immer eine gesonderte Variable nehmen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

ShadowJumper

BeitragFr, Mai 23, 2008 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
offenbar hast du mein Problem verstanden, aberaus deiner Antwort konnte ich keinen richtig funktionierenden Code zusammenstellen... =/

das hab ich ma draus gemacht:
Code: [AUSKLAPPEN]

Type typea
    Field integer
End Type

Type typeb
    Field child.typea
    Field Integer
End Type

Type typec
    Field node.typeb
    Field Integer
End Type


typec.typec = New typec
typec\integer = 1
typec.typec = New typec
typec\integer = 6
typec\node.typeb = New typeb
typec\node\integer = 2
typec\node.typeb = New typeb
typec\node\integer = 5
typec\node\child.typea = New typea
typec\node\child\integer = 3
typec\node\child.typea = New typea
typec\node\child\integer = 4

;besonders diese beiden Werte sind zu beachten, denn eigentlich sollte sie nicht ausgegeben werden...
typeb.typeb = New typeb
typeb\integer = 7
typea.typea = New typea
typea\integer = 8


For container.typeb = Each typeb
    Print container\typea\integer
Next


Delay 12000


das mit der Schleifenvariable werd ich in meinem Code noch ändern... (also in meinem richtigem Code)
Bilder kostenlos hosten
lest und weint:
RAM - 512 MB; GrafikRAM - 32 MB; CPU - 800 MHz
Ps: ... und weint (vor lachen)

Noobody

BeitragFr, Mai 23, 2008 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
 For Container.TypeB = Each TypeB
    If Container\Child <> Null Then Print Container\Child\Integer
Next


Du musst schon den Feldnamen angeben und nicht den Namen des zugeordneten Types Wink
Die Schutzabfrage mit dem "<> Null" ist deswegen, da du ja nicht allen TypeBs einen untergeordneten Type zugeordnet hast - versuchst du trotzdem darauf zuzugreifen, stürzt das Programm mit der Meldung "Object does not exist" ab.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

ShadowJumper

BeitragFr, Mai 23, 2008 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
aber selbst wenn ich den Rechtschreibfehler behebe und die Sicherheitsabfrage einbaue, es werden nicht alle Werte zurückgeliefert (und auch solche, die nicht gefragt sind)
Bilder kostenlos hosten
lest und weint:
RAM - 512 MB; GrafikRAM - 32 MB; CPU - 800 MHz
Ps: ... und weint (vor lachen)

Noobody

BeitragFr, Mai 23, 2008 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Liefert mir 4 zurück, also genau der Wert, der angegeben wurde.
Du musst beachten, dass du mit folgender Anweisung Code: [AUSKLAPPEN]
typec\typeb\typea.typea = New typea
typec\typeb\typea\integer = 3
typec\typeb\typea.typea = New typea
typec\typeb\typea\integer = 4

ein Feld zweimal benutzt und somit den alten Wert überschreibst - 3 wird also nie ausgegeben.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

ShadowJumper

BeitragSa, Mai 24, 2008 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weiß jetzt, wie ich das erreichen kann, was ich will (auch wenn das nicht unbedingt so ist, wie ich es eigtl. wollte...)

ich muss z.B. net "Field child.typea" schreiben, sondern "Field child.typea[x]" (wobei x eine Konstate sein oder durch eine ersetzt werden muss)
ungünstig ist nur, dass "child[]" dann eine feste, (zur Laufzeit) unveränderliche Größe hat =(
Bilder kostenlos hosten
lest und weint:
RAM - 512 MB; GrafikRAM - 32 MB; CPU - 800 MHz
Ps: ... und weint (vor lachen)

Noobody

BeitragSo, Mai 25, 2008 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sind eben Blitzarrays, welche eine feste Grösse haben müssen.
Wenn du wirklich grosse Schwankungen bei der Anzahl der Verlinkungen hast, kannst du einen alternativen Weg über eine Bank gehen, in der du den Index des Typeeintrags speicherst (von Handle zurückgeliefert) und später mit Object auf den Type zugreifen kannst.
Ich schätze aber, dass normalerweise ein Blitzarray in einer gross genug gewählten Grösse meist ausreicht, sofern du nicht mit mehreren hundert Types jonglierst.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group