wie Strukturen koppeln?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

wie Strukturen koppeln?

Beitrag von ProgOldie »

Ich habe eine Struktur Obj, der besondere Eigenschaften in Gestalt einer Struktur Props zugeordnet sind.

Code: Alles auswählen

Structure Props
  Name.s
  ;.....
EndStructure

Structure Obj
  to_Props.i
  ;.........
EndStructure

Define Obj1.Obj
Define Prop1.Props

Obj1\to_Props=@Prop1  ; Koppelung Obj1-->Prop1  speichern
Wie aber greift man von Obj1 auf 'Name' von Prop1 zu? Oder muss man das Ganze anders anpacken?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: wie Strukturen koppeln?

Beitrag von RSBasic »

Meinst du so?

Code: Alles auswählen

EnableExplicit

Structure Props
  Name.s
EndStructure

Structure Obj
  to_Props.i
  Prop1.Props
EndStructure

Define Obj1.Obj

Obj1\Prop1\Name = "hallo"
Debug Obj1\Prop1\Name
Oder was anderes?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: wie Strukturen koppeln?

Beitrag von ProgOldie »

@RSBasic :allright:

Die Idee mit der Struktur in der Struktur war richtig.

Code: Alles auswählen

EnableExplicit

Structure Props
  Name.s
EndStructure

Structure Obj
  to_Prop.Props
EndStructure

Define Obj1.Obj,Prop1.Props

Prop1\Name="Hallo"              ;Eigenschaft von Prop1 festlegen
Obj1\to_Prop=Prop1             ;Prop1 an Obj1 koppeln
Debug Obj1\to_Prop\Name   ;Zugriff von Obj1 auf die Daten des angekoppelten Prop1
So funktioniert es richtig. Oder übersehe ich ein Problem?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: wie Strukturen koppeln?

Beitrag von PMV »

Wenn du mit "koppeln" kopieren meinst, wäre deine Variante richtig.
Spätere änderungen an Prop1.Props werden aber nicht automatisch in
Obj1.Obj übernommen werden.

Dafür müsstest du mit Zeigern arbeiten. Finde den unterschied. Tipp: Du suchst nach nem Stern. :mrgreen:

Code: Alles auswählen

EnableExplicit

Structure Props
  Name.s
EndStructure

Structure Obj
  *to_Prop.Props
EndStructure

Define Obj1.Obj,Prop1.Props

Prop1\Name="Hallo"              ;Eigenschaft von Prop1 festlegen
Obj1\to_Prop=Prop1             ;Prop1 an Obj1 koppeln
Prop1\Name + " World"
Debug Obj1\to_Prop\Name        ;Zugriff von Obj1 auf die Daten des angekoppelten Prop1
Bei deinem Beispiel würde im Debugfenster weiterhin nur "Hallo"
erscheinen, hier erscheint nun aber "Hallo World" <)

Ich würde zudem empfehlen, die Zeile
"Obj1\to_Prop=Prop1"
nun in
"Obj1\to_Prop = @Prop1"
ändern. Passieren tut das gleiche wie vorher, damit wird aber klarer,
was da passiert. In deinem Beispiel ist die Zeile
"Obj1\to_Prop=Prop1"
übrigens gleich
"CopyStructure(Prop1, Obj1\to_Prop, Props)"
Die gleiche Zeile kann somit zu einem ganz anderen Ergebnis führen, nur
weil ein unscheinbares Zeichen an einer ganz anderen Stelle geändert wurde.
:coderselixir:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: wie Strukturen koppeln?

Beitrag von ProgOldie »

Vielen,vielen Dank für den Hinweis. Ich war nämlich gerade dabei, die fehlerhafte Kopplung in einem 2000 Zeilen Programm umzusetzen. Das Gemeine ist: Der Compiler merkt den Unterschied nicht, wohl aber der User.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: wie Strukturen koppeln?

Beitrag von ProgOldie »

Da ihr alle dankenswerterweise so genau hinschaut, prüft doch bitte kurz, ob es bei der folgenden Kopplung per Prozedur evtl. auch versteckte Probleme gibt. Funktionieren tut es jedenfalls.

Code: Alles auswählen

EnableExplicit

Structure Props
  Name.s
EndStructure

Structure Obj
  *to_Prop.Props
EndStructure

Procedure kopple(*Objekt.Obj,*Propos.Props)
  *Objekt\to_Prop=*Propos
EndProcedure

Define Obj1.Obj,Prop1.Props

Prop1\Name="Hallo"              ;Eigenschaft von Prop1 festlegen
kopple(@Obj1,@Prop1)

Prop1\Name + " World"
Debug Obj1\to_Prop\Name        ;Zugriff von Obj1 auf die Daten des angekoppelten Prop1


Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: wie Strukturen koppeln?

Beitrag von PMV »

Das funktioniert so weit.
Denk nur drann, das Obj1 nun auch auf Prop1 zugreift, selbst wenn Prop1
bereits wieder frei gegeben wurde. -> IMA

Du musst also nun selber dafür sorgen, das Prop1 mindestens so lange
existiert wie Obj1. Das ist in so weit wichtig, als wenn du Anfängst mit
AllocateMemory() und FreeMemory() selber den Speicher fest zu legen.
Auch (aus versehen) Obj1 als Global und Prop1 nur lokal in einer
Prozedur definiert würde den gleichen Fehler bedeuten.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: wie Strukturen koppeln?

Beitrag von ProgOldie »

Zwei kurze Fragen noch:

1. Wie kann man abfragen, ob Prop1 auch existiert?
2. Wie erreicht man, dass Obj1 keine Variable der Struktur Props zugeordnet ist? ( Obj1\to_Prop=0 geht wohl nicht)

Dank schon 'mal vorab für die gesamte Unterstützung zu diesem Thema.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: wie Strukturen koppeln?

Beitrag von PMV »

Zu 1.
Im prinzip gar nicht. Deine Programmlogik muss sicher stellen, das dieser auf
nur gültigen Speicherbereich zu greift. Das ist auch der Grund, warum das
arbeiten mit Zeigern so "gefährlich" und nur für Fortgeschrittene ist. Damit
kann man sich viel kaputt machen. :wink:

Wenn man aber mit bedacht damit umgehet und weis, was man tut, dann
ist es eine sehr wirksames Werkzeug. Wie du das in deinem Fall am besten machst,
kann ich nicht sagen, es kommt auf deine Programmlogik an, die du erreichen
willst.

Zu 2.
Doch. Gängig ist Obj1\to_Prob = #Null zu setzen und dann vor jedem! Zugriff auf Obj1\to_Prob
diesen auf #Null zu prüfen. Wenn dieser einen anderen Wert als #Null hat, ist der Zugriff
ok. Mit Zugriff meine ich den Aufruf von z.B. Obj1\to_Prob\Name oder anderen Attributen, die
in der Struktur von Probs enthalten sind.

Wenn du allerdings Obj1\to_Prob = #Null setzt, aber anschließend trotzdem Obj1\to_Prob\Name
aufrufst, wird das genau so ein IMA hervorrufen, wie wenn du den Speicherbereich von Prob1
bereits frei gegeben hattest.

Wenn Prob1, aus welchem Grund auch immer, durch etwas anderes ersetzt werden soll,
musst du sicher gehen, das alle Objekte, die Prop1 verwendet haben, ebenffalls dann
mit dem neuen Ersetzt werden. Vergisst du nur eine Zeile, wird das zu einem
IMA führen. Das kann im Übrigen sogar an einer ganz anderen stelle passieren,
als wie wo die fehlende If-Abfrage wäre.

Hm ... hoffe du konntest mir folgen. :oops:
Am besten, du stellst dir Bildlich vor, wie die Speicherzugriff aussehen.

Obj1 und Prop1 sind jeweils 2 unterschiedliche Speicherbereiche zugwiesen.
In dem du Obj1\to_Prob = @Prop1 zuweist, wird kein neuer Speicherbereich erstellt.
Es wird beim Aufruf von Obj1\to_Prob\Name tatsächlich nun auf den Speicherbereich
von Prop1 zugegriffen. Existiert Prop1 nicht mehr, ist der Zugriff auf Prop1 und damit
auch auf Obj1\to_Prob\Name ungültig. -> IMA

Das verhindern geht also nur, in dem du schlicht nicht mehr darauf zu greifst.
Dazu sind also unter umständen sehr viele If-Abfragen notwendig. Du brauchst
aber natürlich auch nicht jede Zeile einzeln zu prüfen. Wenn du in einem
Block auf alle Prop1 eigenschaften über Obj1 zugreifst, z.B.

Code: Alles auswählen

Debug Obj1\to_Prop\Name
Debug Obj1\to_Prop\Alter
Debug Obj1\to_Prop\Breite
reicht es, wenn du um den ganzen Block eine If-Abfrage machst.

Code: Alles auswählen

If Obj1\to_Prop
  Debug Obj1\to_Prop\Name
  Debug Obj1\to_Prop\Alter
  Debug Obj1\to_Prop\Breite
Else
  Debug "Obj1" hat keine gültigen Eigenschaften!"
EndIf
PS: In PB ist #Null tatsächlich nichts weiter als 0.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
bizzl
Beiträge: 82
Registriert: 08.09.2005 18:07
Computerausstattung: AMD Athlon II X4 635
Windows 7 64 Bit
Wohnort: Nordhessen - früher : Südniedersachsen

Re: wie Strukturen koppeln?

Beitrag von bizzl »

Nur mal so als Gedankenspiel - wie wäre es, wenn du es mit Vererbung probierst?
Siehe Structure <Extends> in der Hilfe.
Würde das bei der Lösung deines Problems helfen?

Bin nicht fit genug mich tief da reinzudenken, komme gerade von einer Geburtstagsfeier - Sorry -
Antworten