Seite 1 von 1
Dereferenzierung
Verfasst: 04.07.2017 21:13
von Muttonhead
Ein freundliches Hallo @PBGemeinde:
(aus leichter Bierseeligkeit) hab ich mich denn doch mal zum Lizenznehmer gemacht und gleich mal ein paar Fragen:
Code: Alles auswählen
EnableExplicit
Structure any
StructureUnion
b.b
i.i
l.l
q.q
EndStructureUnion
EndStructure
;******************************************************************************
Define A.i, addressA.q, *addressA, *addressAstruct.any
A=123456
addressA.q =@A;Adresse von A "gesichert" in einem quad, da in meinem Fall nen 64bit system
*addressA =@A;Adresse von A als Pointer, wie könnte ich diese nutzen?
*addressAstruct.any =@A;Adresse von A als "strukturisierter" Pointer, erst damit Dereferenzierung möglich?
Debug addressA
Debug *addressA
Debug *addressAstruct.any
Debug "****************"
;Dereferenzierung, also "Inhalt" des Speichers ab(!) dieser Adresse entsprechend der "Typisierung in der Struktur":
Debug *addressAstruct\b
Debug *addressAstruct\i
Debug *addressAstruct\l
Debug *addressAstruct\q
Eigentlich ging es mir um die BYREF Übergabe von "externen" Variablen an eine PROCEDURE und die Dereferenzierung dieser Variable, ob nun innerhalb oder
ausserhalb ist wohl egal.
meine Fragen hab ich eigentlich im Codeschnipsel hinterlegt...
Mutton
Re: Dereferenzierung
Verfasst: 04.07.2017 21:44
von mk-soft
Abend mal schnell gebastelt. Nur mal grob angedeutet...
Code: Alles auswählen
EnableExplicit
; Beispiel 1: Eigenen Variablentype
Structure any
Type.i
StructureUnion
b.b
i.i
l.l
q.q
f.f
d.d
EndStructureUnion
s.s
EndStructure
Define var1.any, var2.any
var1\Type = #PB_Integer
var1\i = 1000
var2\Type = #PB_String
var2\s = "Hallo Welt"
Procedure foo(*var.any)
Select *var\Type
; Case...
Case #PB_Integer
Debug *var\i
Case #PB_String
Debug *var\s
EndSelect
EndProcedure
foo(var1)
foo(var2)
; Beispiel 2: Integer als ByRef
Procedure foo2(*value.Integer)
Debug *value\i
*value\i = -1000
EndProcedure
Define iVal.i = 9999
foo2(@iVal)
Debug iVal
; Beispiel 3: Strings als ByRef gehen nur als Strukture
Procedure foo3(*value.String)
Debug *value\s
*value\s + ReverseString(*value\s)
EndProcedure
Define sVal.String
sVal\s = "Hello World "
foo3(sVal)
Debug sVal\s
Re: Dereferenzierung
Verfasst: 04.07.2017 22:24
von Muttonhead
@mk-soft:
vielen Dank für deine Beispiele. Werd das erstmal ordentlich zerlegen.
.integer hab ich ich irgendwo schon im Forum gefunden(vermutlich stammt der Post sogar von dir

)
Hilft mir auf jeden Fall weiter
Mutton
(als newbie muss ich das Zeugs hier links benutzen :p)
Re: Dereferenzierung
Verfasst: 28.07.2017 17:37
von Muttonhead
...Hallo @all. Bin mir nicht sicher ob das unter die gleiche Rubrik fällt:
Code: Alles auswählen
Structure arraystruct
a.i
b.i
EndStructure
Structure mainstruct
c.i
d.arraystruct[10]
EndStructure
Declare servantproc(Array arrayaccess.arraystruct(1))
Procedure masterproc(*ms.mainstruct)
With *ms
\c=servantproc(\d())
EndWith
EndProcedure
Procedure servantproc(Array arrayaccess.arraystruct(1))
ProcedureReturn 1;dummy
EndProcedure
wie bekommt die Prozedur servantproc, aufgerufen innerhalb vom masterproc, Zugriff aufs Array? Oder vielmehr wie ist die Parameterübergabe?
Vielen Dank im voraus Mutton
Re: Dereferenzierung
Verfasst: 28.07.2017 17:53
von NicTheQuick
Du verwechselst dynamische Arrays mit statischen. So würde es zum Beispiel funktionieren
Code: Alles auswählen
Structure arraystruct
a.i
b.i
EndStructure
Structure mainstruct
c.i
d.arraystruct[10]
EndStructure
Structure onlyarray
d.arraystruct[0]
EndStructure
Declare servantproc(*arrayaccess.onlyarray)
Procedure masterproc(*ms.mainstruct)
With *ms
\c = servantproc(@\d)
EndWith
EndProcedure
Procedure servantproc(*arrayaccess.onlyarray)
ProcedureReturn *arrayaccess\d[0]\a + *arrayaccess\d[0]\b
EndProcedure
Define a.mainstruct
a\d[0]\a = 12
a\d[0]\b = 3
masterproc(a)
Debug a\c
Re: Dereferenzierung
Verfasst: 28.07.2017 18:20
von Muttonhead
Du verwechselst dynamische Arrays mit statischen. So würde es zum Beispiel funktionieren
...na das wohl mit Sicherheit
Vielen Dank für die quicke Antwort. Werde damit mal arbeiten. So ganz gefällt es mir nicht, kann es aber so halbwegs nachvollziehen.
So ein wenig wirkt der Zugriff wie mit ner Gehhilfe, eine zusätzliche Struktur...
Ich danke Dir auf jeden Fall nochmal für die schnelle Antwort
Mutton
PS: Mein Problem ist eigentlich folgendes: Im Prinzip hat die Beziehung/Zugriff servantproc <--> arraystruct schon vorher bestanden. Erst nach dem Einbetten in eine höhere Struktur/Prozedur habe ich halt dieses Problem
PPS:
Code: Alles auswählen
Structure arraystruct
a.i
b.i
EndStructure
Structure mainstruct
c.i
Array d.arraystruct(10)
EndStructure
Declare servantproc(Array arrayaccess.arraystruct(1))
Procedure masterproc(*ms.mainstruct)
With *ms
\c=servantproc(\d())
EndWith
EndProcedure
Procedure servantproc(Array arrayaccess.arraystruct(1))
ProcedureReturn 1;dummy
EndProcedure
ahhhh... dynamisch/statisch...
