You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nim语言中访问C指针数组的元素?

解决C指针数组的元素访问问题

首先要明确:你当前的类型声明有误。C语言中的指针数组(比如Assimp里的aiMesh** mMeshes)在Nim中对应的类型是ptr ptr aiMesh,而不是ptr aiMesh。错误的类型声明会导致直接索引无法生效。

正确的元素访问方式

先修正类型声明,再通过双层解引用访问元素:

# 修正类型为 ptr ptr aiMesh
let aiArray: ptr ptr aiMesh = sceneptr[].mMeshes[]

# 方式1:直接双层索引访问
let firstMesh = aiArray[][0]
let secondMesh = aiArray[][1]

# 方式2:分步解引用后索引
let meshPtrArray = aiArray[]  # 解引用外层指针,得到aiMesh*[]的指针
let firstMesh = meshPtrArray[0]

转换为Nim原生数组(可选)

如果你想使用Nim的原生数组语法,可以通过内存拷贝将C指针数组转换为Nim数组,前提是你知道数组的长度(Assimp场景中可通过mNumMeshes获取):

import memcpy

let meshCount = sceneptr[].mNumMeshes
# 声明对应长度的Nim数组
var nimMeshArray: array[0..<meshCount, ptr aiMesh]
# 从C指针数组拷贝数据到Nim数组
copyMem(addr nimMeshArray[0], sceneptr[].mMeshes, meshCount * sizeof(ptr aiMesh))

# 之后即可直接用原生数组索引
let firstMesh = nimMeshArray[0]

为什么之前的尝试失败

  • 直接用aiArray[0]:因为你把aiMesh**声明成了ptr aiMesh,此时索引操作是对单个aiMesh*指针进行偏移,而非访问指针数组的元素。
  • 赋值给array[0..0, aiMesh]:这种方式需要正确的类型匹配,且未指定完整长度,无法直接完成C指针数组到Nim数组的转换。

内容的提问来源于stack exchange,提问作者DARSHAN KOIRALA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:12:10