"verschachtelte Types"
Übersicht

![]() |
ShadowJumperBetreff: "verschachtelte Types" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group