Zyklische Struktur

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Zyklische Struktur

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Zyklische Struktur

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Zyklische Struktur

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Zyklische Struktur

Beitrag 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.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Zyklische Struktur

Beitrag 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.
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Zyklische Struktur

Beitrag von mhs »

Hmm.. da war ich gedanklich wohl schon bei der Variablendefinition. Du hast natürlich recht :allright:
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Re: Zyklische Struktur

Beitrag 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 :)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Zyklische Struktur

Beitrag von mhs »

:roll: Gestern war wohl nicht so mein Tag...
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Zyklische Struktur

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Antworten