Seite 1 von 1

Zyklische Struktur

Verfasst: 27.04.2016 17:04
von CSHW89
Hallo Leute,

ich hab mal ne kleine Frage zu zyklischen Strukturen. Hatte das hier nicht mal funktioniert?

Code: Alles auswählen

Structure TestMain
  *a.Test1
;   Array *b.Test2()
;   List *c.Test3()
;   Map *d.Test4()
EndStructure

Structure Test1 Extends TestMain
  ; ...
EndStructure
Structure Test2 Extends TestMain
  ; ...
EndStructure
Structure Test3 Extends TestMain
  ; ...
EndStructure
Structure Test4 Extends TestMain
  ; ...
EndStructure
Die Variable '*a' funktioniert ohne Probleme. Normalerweise prüft PB die Struktur bei Pointern erst dann, wenn mit z.b. 'testMain\a\foo' auf ein Element der Struktur zugegriffen wird. Aber warum funktioniert das nicht mit Arrays/Listen/Maps? Gibts da ein Workaround für?

lg Kevin

Re: Zyklische Struktur

Verfasst: 27.04.2016 19:51
von STARGÅTE
Ich kann dir leider nicht sagen ob/wann es mal funktioniert hat, aber ich selbst bin auch schon über diese Hürde gestolpert.

Komischer weise geht eine direkte Rekursivität ohne Probleme:

Code: Alles auswählen

Structure Test
	List Test.Test()
EndStructure
Als Workaround hatte ich bei mir in solchen Fällen immer eine (abgespekte) ZusatzStruktur vor der Main erstellt, und zwar so oft, wie ich die Rekursion direkt im Code brauche (also beim schreiben der Strukturtiefe):

Code: Alles auswählen

Structure FakeTest1
  List *c()
  String.s
  Float.f
EndStructure

Structure TestMain
  List *c.FakeTest1()
EndStructure

Structure Test1 Extends TestMain
  String.s
  Float.f
EndStructure

Re: Zyklische Struktur

Verfasst: 27.04.2016 21:14
von CSHW89
Erstmal danke. Ja ist wirklich komisch, zumal ich ja keine "echte" Rekursion brauche, sondern nur Pointer. Hm dann muss ich das wohl machen mit der FakeStruktur. Ich glaube, ich schreib aber mal ein Request ins englische Forum. Bei einfachen Variablen gehts ja, dass er die Struktur (noch) nicht kennt, und erst bei Benutzung prüft. Dies kompiliert z.b.:

Code: Alles auswählen

Structure Test
  *a.DieseStrukturExistiertGarNicht
EndStructure
test.Test
; i = test\a\i
lg Kevin

Re: Zyklische Struktur

Verfasst: 28.04.2016 17:39
von mhs
Das liegt einfach daran, dass die Strukturen Test2-4 zu dem Zeitpunkt dem Compiler noch nicht bekannt sind. Listen, Maps etc. werden aber gleich initialisiert und ohne Struktur funktioniert das nicht.

Zeiger auf Listen, Maps, etc wie in deinem Beispiel sind in PB nicht möglich.

Re: Zyklische Struktur

Verfasst: 28.04.2016 17:43
von NicTheQuick
In Strukturen wird nichts initialisiert. Erst, wenn man die Struktur tatsächlich an eine Variable hängt oder man 'InitializeStructure()' benutzt.

Meiner Meinung ist das eine Problem, das behoben werden kann. Es spricht nämlich nichts dagegen, dass es so funktionieren könnte wie es im ersten Post gewünscht ist.

Re: Zyklische Struktur

Verfasst: 28.04.2016 20:01
von mhs
Hmm.. da war ich gedanklich wohl schon bei der Variablendefinition. Du hast natürlich recht :allright:

Re: Zyklische Struktur

Verfasst: 29.04.2016 00:27
von #NULL
mhs hat geschrieben:Zeiger auf Listen, Maps, etc wie in deinem Beispiel sind in PB nicht möglich.
nicht verwechseln: er will eine list etc. aus pointern auf eine struktur, nicht einen pointer auf eine list :)

Re: Zyklische Struktur

Verfasst: 29.04.2016 07:05
von mhs
:roll: Gestern war wohl nicht so mein Tag...

Re: Zyklische Struktur

Verfasst: 29.04.2016 11:58
von CSHW89
Das interessante daran ist ja, dass dieses Verhalten im Compiler bereits implementiert ist. Mit normalen Variablen lässt er die Prüfung der Struktur sein, und prüft erst bei der Benutzung des Pointers. Dies kompiliert ja noch:

Code: Alles auswählen

Structure Test
  *a.DieseStrukturExistiertNicht
EndStructure
Define test.Test, *b, c
*b = test\a
; c = test\a\foo ; erst hier, käme ein Compilerfehler
Man müsste das Verhalten nur auf Arrays/Listen/Maps übertragen.

lg Kevin