Zeiger auf Strukturen in Strukturen

Für allgemeine Fragen zur Programmierung mit PureBasic.
bEEtzY
Beiträge: 27
Registriert: 03.02.2005 23:46

Zeiger auf Strukturen in Strukturen

Beitrag von bEEtzY »

Hallo Leute,

habe da ein kleines Zeigerproblem,
ich versuche einen Zeiger auf eine Strukture1 in einer anderen Struktur2 zu speichern, wie kann ich nun ueber Struktur2 auf den Inhalt von Struktur1 zugreifen?

Beispiel:

Structure Struct1
a.l
EndStructure

Structure Struct2
S1.l
EndStructure

NewList Structure2.Struct2()
NewList Structure1.Struct1()

AddElement(Structure1())
a = 10

Procedure.l Add(*Struct.Struct1)
AddElement(Structure2())
Structure2()\S1 = *Struct

ProcedureReturn @Structure2()
EndProcedure

Procedure Access(*Struct.Struct2)
; wie kann ich nun auf a von Structure1 zugreifen???
; und weshalb kann ich in der Definition von Struct2
; nicht *S1.Struct1 schreiben???
EndProcedure

im vorraus schon herzlichen dank!
solong IRL
bEEtzY

Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Pointer (*pointer) werden leider nicht richtig in Structuren unterstützt, bzw. sind fehlerhaft

Denkansatz (und Lösung?)

Code: Alles auswählen

*S1.struct1=*Struct\s1
debug *s1\a
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
bEEtzY
Beiträge: 27
Registriert: 03.02.2005 23:46

Beitrag von bEEtzY »

Das Problem ist, dass ich nicht an die Werte ran komme, wenn ich folgendes mache:

Add(@Structure1())
Debug Structure2()\S1
Debug @Structure1()

so ergeben beide Debugausgaben die gleiche Adresse, also ist die Adresse von Struktur1 in der Struktur2 gespeichert, aber ich komme nicht an den Inhalt von Struktur1 heran, also 'a'.
Das muss doch irgendwie gehen!?
solong IRL
bEEtzY

Bild
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Code: Alles auswählen

Structure Struct1 
  a.l 
EndStructure 

Structure Struct2 
  S1.l 
  s2.l
EndStructure 

NewList Structure2.Struct2() 
NewList Structure1.Struct1() 

Procedure.l Add(*Struct.Struct1) 
  AddElement(Structure2()) 
  Structure2()\S1 = *Struct 
  
  ProcedureReturn @Structure2() 
EndProcedure 

Procedure Access(*Struct.Struct2) 
  ; wie kann ich nun auf a von Structure1 zugreifen??? 

  Debug "access"
  Debug *Struct\S1 ; das ist deine Adresse
  Debug PeekL(*Struct\S1) ; und so liest du sie aus
  
  
  ; und weshalb kann ich in der Definition von Struct2 
  ; nicht *S1.Struct1 schreiben???   
  
  ; da hab ich selber keine Ahnung...
EndProcedure 



AddElement(Structure1()) 
Structure1()\a = 10 ; a musst du als teil der struktur belegen
Debug Add(@Structure1()) 
Debug Structure2()\S1 
Debug @Structure1() 
Access(@Structure2()) 
Du hattest nur die Variable a belegt

Code: Alles auswählen

a = 10
wenn Du das Element a in der Struktur struct1 belegen möchtest, geht das so

Code: Alles auswählen

Structure1()\a = 10
Auf den Inhalt greifst per PeekL zu (siehe oben)

Hoffe das hilft dir etwas
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Falls Du die Struktur struct1 etwas komplexer hast, kannst Du über diesen Weg dir die Progeammierarbeit etwas erleichtern, kostet aber etwas mehr Rechenzeit...

Code: Alles auswählen

Structure Struct1 
  a.l 
EndStructure 

Structure Struct2 
  S1.l 
  s2.l 
EndStructure 

NewList Structure2.Struct2() 
NewList Structure1.Struct1() 

Procedure.l Add(*Struct.Struct1) 
  AddElement(Structure2()) 
  Structure2()\S1 = *Struct 
  
  ProcedureReturn @Structure2() 
EndProcedure 

Procedure Access(*Struct.Struct2) 
  ; wie kann ich nun auf a von Structure1 zugreifen??? 
  
  Debug "access" 
  Debug *Struct\S1 ; das ist deine Adresse 
  Debug PeekL(*Struct\S1) ; und so liest du sie aus 
  
  ; wenn du komplexere Strukturen hast, kannst Du die Arbeit etwas erleichtern, kostet dafür etwas mehr Zeit...
  tmp.Struct1
  CopyMemory(*Struct\S1, @tmp, SizeOf(Struct1))
  
  Debug "a über hilfsvar: " + Str(tmp\a)
  tmp\a = 20
  
  ; wenn Du Änderungen machst, kannst du dann wieder so zurückschreiben
  CopyMemory(@tmp, *Struct\S1, SizeOf(Struct1))
  
  
  ; und weshalb kann ich in der Definition von Struct2 
  ; nicht *S1.Struct1 schreiben???    
  
  ; da hab ich selber keine Ahnung... 
EndProcedure 



AddElement(Structure1()) 
Structure1()\a = 10 ; a musst du als teil der struktur belegen 
Debug Add(@Structure1()) 
Debug Structure2()\S1 
Debug @Structure1() 
Access(@Structure2()) 

Debug "a nach änderung: " + Str(Structure1()\a)

Dabei nimmst du eine Hilfsvariable, initialisierst die mit der Struktur struct1 und kopierst dann die Inhalte rüber. Dann kannst du mit den üblichen Strukturaddressierungen drauf zugreifen. Bei Änderungen müsst du diese dann eben wieder zurückschreiben. (Siehe das Beispiel im Code)
Antworten