[ERLEDIGT] Wie auf Array mithilfe eines Pointers zugreifen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

[ERLEDIGT] Wie auf Array mithilfe eines Pointers zugreifen?

Beitrag von Mijikai »

Wie auf ein Array mithilfe eines Pointers zugreifen?

Ich würde gerne ein Array verwenden um auf die einzelnen Pixel im Speicher zuzugreifen.
Irgendwie geht das doch oder? :freak:

Code:

Code: Alles auswählen

EnableExplicit

Structure VIDEO_BUFFER
  width.i
  height.i
  *bits
  size.i
EndStructure  

Structure PIXEL
  Array color.Long(0,0)
EndStructure

Procedure.i VideoBuffer(Width.i,Height.i)
  Protected *buffer.VIDEO_BUFFER
  Protected bytes.i
  bytes = (Width * Height) * 4
  *buffer = AllocateMemory(bytes + SizeOf(VIDEO_BUFFER))
  If *buffer
    With *buffer
      \width = Width
      \height = Height
      \bits = *buffer + SizeOf(VIDEO_BUFFER)
      \size = bytes
    EndWith
  EndIf
  ProcedureReturn *buffer
EndProcedure

Procedure.i Main()
  Protected *vid.VIDEO_BUFFER
  Protected *pixel.PIXEL
  *vid = VideoBuffer(320,200);nur zu Demozwecken - in Realität haben wir nur den Zeiger/Pointer auf einen VIDEO_BUFFER...
  If *vid
    Debug "Buffer: 0x" + Hex(*vid)
    
    *pixel = *vid;<- Zeiger/Pointer übergeben...
    Debug *pixel\color(10,10);<- wie kann ich das array verwenden?
    
    FreeMemory(*vid)
  EndIf
  ProcedureReturn #Null
EndProcedure

Main()

End
Zuletzt geändert von Mijikai am 26.10.2020 01:09, insgesamt 1-mal geändert.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Wie auf ein Array mithilfe eines Pointers zugreifen?

Beitrag von ccode_new »

Hallo!

Normal so:

Code: Alles auswählen

Protected Dim pixel.PIXEL(0)
Dim pixel(0)\color(10,10)
Aber mit Pointer und so wie du vielleicht willst ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
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: Wie auf ein Array mithilfe eines Pointers zugreifen?

Beitrag von NicTheQuick »

"Array" erstellt ein dynamisches Array. Das erstellt also seinen eigenen Speicher, den man nicht wiederverwenden kann. Stattdessen musst du entweder zwei geschachtelte statische Arrays mit wenigstens einer festen Dimension nutzen oder aber du nutzt ein eindimensionales "unendliches" Array, das nur noch dafür da ist beliebige Stellen im Speicher per Index anzusprechen. Zusammen mit einem Macro kannst du den Index dann auch dynamisch an width anpassen.
Das könnte dann so aussehen:

Code: Alles auswählen

EnableExplicit

Structure PIXEL
	color.l[0]
EndStructure

Structure VIDEO_BUFFER
	width.i
	height.i
	*bits.PIXEL
	size.i
EndStructure 

Macro color(vid, x, y)
	vid\bits\color[x + y * vid\width]
EndMacro

Procedure.i VideoBuffer(Width.i,Height.i)
	Protected *buffer.VIDEO_BUFFER
	Protected bytes.i
	bytes = (Width * Height) * 4
	*buffer = AllocateMemory(bytes + SizeOf(VIDEO_BUFFER))
	If *buffer
		With *buffer
			\width = Width
			\height = Height
			\bits = *buffer + SizeOf(VIDEO_BUFFER)
			\size = bytes
		EndWith
	EndIf
	ProcedureReturn *buffer
EndProcedure

Procedure.i Main()
	Protected *vid.VIDEO_BUFFER
	Protected *pixel.PIXEL
	*vid = VideoBuffer(320,200);nur zu Demozwecken - in Realität haben wir nur den Zeiger/Pointer auf einen VIDEO_BUFFER...
	If *vid
		Debug "Buffer: 0x" + Hex(*vid)
		
		color(*vid, 10, 10) = 1234
		Debug color(*vid, 10, 10)
		
		FreeMemory(*vid)
	EndIf
	ProcedureReturn #Null
EndProcedure

Main()

End
Bild
Antworten