Seite 1 von 1

[ERLEDIGT] Wie auf Array mithilfe eines Pointers zugreifen?

Verfasst: 25.10.2020 21:53
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

Re: Wie auf ein Array mithilfe eines Pointers zugreifen?

Verfasst: 25.10.2020 23:10
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 ?

Re: Wie auf ein Array mithilfe eines Pointers zugreifen?

Verfasst: 25.10.2020 23:54
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

Re: [ERLEDIGT] Wie auf Array mithilfe eines Pointers zugreif

Verfasst: 26.10.2020 01:10
von Mijikai
Super, danke für die schnellen Antworten :allright: