Replies: 1 comment
-
You can use them in F#: [<Struct>]
[<System.Runtime.CompilerServices.InlineArray(10)>]
type FixedBuffer =
struct
val element0:int
end
[<Struct; StructLayout(LayoutKind.Sequential)>]
type StructWithBuffer =
struct
val field1:int
val field2:int
val otherFixedField:FixedBuffer
end and then use it like this: let size = Marshal.SizeOf<StructWithBuffer>()
printfn "Size of StructWithBuffer: %i" size
let ptr = NativePtr.stackalloc<StructWithBuffer> 1
let unmarshaled : StructWithBuffer = ptr |> NativePtr.read
// The type system knows the buffer it pointing to ints, but not the size of the buffer
let fixedField = &&unmarshaled.otherFixedField.element0
fixedField |> NativePtr.read |> printfn "Fixed field first element: %i"
// You need to take care not to read past the index.
NativePtr.get fixedField 4 |> printfn "Fixed field element 4: %i"
// You need to take care not to read past the index.
NativePtr.get fixedField 11 |> printfn "Fixed field element 11 (this is something else's data): %i" output:
You see it allocates 48 bytes:
You can read and write those elements and |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
For example in C# there is :
or in C# 12 supported by the up coming .NET 8
how do I create these struct and use it in F#
Beta Was this translation helpful? Give feedback.
All reactions