Dereferenzierung

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Muttonhead
Beiträge: 20
Registriert: 25.06.2017 14:06
Computerausstattung: I7

Dereferenzierung

Beitrag 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
PureBasic 5.62 (Windows 10 Home - x64) | i7 7700HQ | 32GB | HD Graphics 630 / GeForce GTX 1060 Max-Q
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Dereferenzierung

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Muttonhead
Beiträge: 20
Registriert: 25.06.2017 14:06
Computerausstattung: I7

Re: Dereferenzierung

Beitrag 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 :allright:

Mutton
(als newbie muss ich das Zeugs hier links benutzen :p)
PureBasic 5.62 (Windows 10 Home - x64) | i7 7700HQ | 32GB | HD Graphics 630 / GeForce GTX 1060 Max-Q
Benutzeravatar
Muttonhead
Beiträge: 20
Registriert: 25.06.2017 14:06
Computerausstattung: I7

Re: Dereferenzierung

Beitrag 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
PureBasic 5.62 (Windows 10 Home - x64) | i7 7700HQ | 32GB | HD Graphics 630 / GeForce GTX 1060 Max-Q
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Dereferenzierung

Beitrag 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
Bild
Benutzeravatar
Muttonhead
Beiträge: 20
Registriert: 25.06.2017 14:06
Computerausstattung: I7

Re: Dereferenzierung

Beitrag von Muttonhead »

Du verwechselst dynamische Arrays mit statischen. So würde es zum Beispiel funktionieren
...na das wohl mit Sicherheit :D

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...
:)
PureBasic 5.62 (Windows 10 Home - x64) | i7 7700HQ | 32GB | HD Graphics 630 / GeForce GTX 1060 Max-Q
Antworten