memview
Abstract
Create a view into a table or another array
Description
memview makes it possible to operate on a table as if it were an array (using any array opcode), or to operate on a slice of an array without copying the underlying memory. It can be used to efficiently read a slice of an existing array, operate on rows of a 2D matrix, etc.
The underlying memory is shared between the source and the view for the duration of the event.
Using the returned array as a left-side variable is not supported. This can result in reallocation/resizing of the array, which in this case is not allowed since the underlying memory does not belong to the array. Using it in this way results in undefined behaviour
The same holds true for creating a view from a ftable and freeing the ftable during the lifetime of the view.
Syntax
iView[] memview ift, [, istart=0, iend=0]
kView[] memview iSource[] [, istart=0, iend=0]
kView[] memview kSource[] [, istart=0, iend=0]
Arguments
ift
: the source ftableiSource[] / kSource[]
: the source arrayistart
: the start index of the view (default=0)iend
: the end index of the view (non inclusive, default=end of the table / array)
Output
iView[]
/kView[]
: the array view
Execution time
- Init
Examples
<CsoundSynthesizer>
<CsOptions>
--nosound
-m0
-d
</CsOptions>
<CsInstruments>
/*
memview
Create a view into a table or another array
iView[] memview ift, [, istart=0, iend=0]
kView[] memview iSource[] [, istart=0, iend=0]
kView[] memview kSource[] [, istart=0, iend=0]
ift: the source ftable
iSource[] / kSource[]: the source array
istart: the start index of the view (default=0)
iend: the end index of the view (non inclusive, default=end of
the table / array)
memview makes it possible to operate on a table as if it
were an array, using any array opcode.
It is also possible to take a slice from a different array
without copying the underlying elements. It can be used to
efficiently read a slice of an existing array, operate on
rows of a 2D matrix, etc.
The underlying memory is shared between the source and the view
for the duration of the event.
It is not supported to reuse the array as a left-side variable
because that could incurr in reallocation / resizing, which in this
case is not allowed since the underlying memory does not belong to
the array. Using it in this way results in undefined behaviour.
The same holds true for creating a view from a ftable and freeing
the ftable during the lifetime of the view.
*/
gitab ftgen 0, 0, 10, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
instr 1
iView[] memview gitab
prints "\n$$$$ Original array:"
printarray iView
iView[2] = 20
iView *= 0.5
prints "\n$$$$ Modified array:"
printarray iView
prints "\n$$$$ Source table should be modified as well\n"
ftprint gitab
prints "array length: %d \n", lenarray(iView)
turnoff
endin
instr 2
kView[] memview gitab
printf "\n$$$$ Original array:", 1
printarray kView
kView[2] = 20
kView *= 0.5
printf "\n$$$$ Modified array:", 1
printarray kView
printf "\n$$$$ Source table should be modified as well\n", 1
ftprint gitab, -1
turnoff
endin
instr 3
iX[] fillarray 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
iY[] memview iX, 5
kZ[] memview iX, 3, 8
iY *= 10
printarray iY
printarray iX
printarray kZ
turnoff
endin
instr 4
kX[] fillarray 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
kY[] memview kX, 5
kY *= 0.5
printarray kX
printarray kY
turnoff
endin
</CsInstruments>
<CsScore>
; i1 0 1
; i2 0 1
i3 0 1
; f0 3600
</CsScore>
</CsoundSynthesizer>
See also
Credits
Eduado Moguillansky, 2019