f# - 有没有办法在 F# 中将 0 表示为 void 指针
问题描述
在 OpenGL 中,通常调用gl.TexImage2D
需要 avoid*
作为最终数据参数。可以稍后传递数据,因此最后一个参数也可以设置为0
. 在 F# 中,我还没有找到一种干净的方式来0
转换为voidptr
.
以下对我有用,但有更清洁的解决方案吗?
let emptyData: array<byte> = [||]
use emptyPtr = fixed emptyData
let voidPtr = emptyPtr |> NativePtr.toVoidPtr
gl.TexImage2D(
GLEnum.Texture2D,
0,
int GLEnum.Red,
atlasWidth,
atlasHeight,
0,
GLEnum.Red,
GLEnum.UnsignedByte,
voidPtr
)
解决方案
该类型voidptr
是 .NET 的别名System.Void*
,但 .NET 编译器不希望我们直接使用该类型。所以IntPtr.ToPointer()
提供了将任何指针转换为 void 指针。在你的情况下,你想转换一个空指针(即,0n
),所以你可以使用
IntPtr.Zero.ToPointer()
您也可以使用0n.ToPointer()
,正如其他评论者指出的那样,它Unchecked.defaultof<_>
也可以使用,因为编译器可以在这里推断出您需要什么。(IntPtr.Zero.ToPointer()
是最易读的,IMO)。
推荐阅读
- python - 如何有效地计算python中的离散概率?
- html - 图片背后的移动菜单
- r - R Markdown - PDF 输出中绘图旁边的说明
- javascript - 如何在页面中使用(允许)cookie?Javascript
- flutter - 在 GetX 内部分支的正确方法是什么?
- azure-devops - Azure Devops - 无法构建从 vs2017-win2016 到 windows-latest 的管道代理
- spring-boot - 如何在 SpringBoot 中创建 Bean
- reactjs - React:如何在我的 JSX 中使用 API 调用的结果?(范围问题)
- javascript - 使用 Graphql 装饰器的自定义装饰器
- java - 如何解决 java.lang.ClassCastException:net.sf.json.JSONObject 无法转换为 net.sf.json.JSONObject