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

Dart/Flutter FFI中List<double>转换为结构体Array<Float>的方法

问题本质

dart:ffi 中用于映射C数组的Array<T>类型,和Dart原生的List属于完全独立的类型体系,不存在继承关系,直接强转一定会报错。
同时你用@Array.multi([12])标注的结构体成员,指向的是结构体内部预分配的固定长度原生内存段,本身不支持整体替换引用——你没法给这个external字段重新赋值一个新的Array实例,只能操作这块内存里存储的具体元素。

正确实现方式

直接通过下标遍历,把List<double>里的元素逐个写入Array<Float>对应的内存位置即可,Array原生支持下标读写操作。
示例代码:

import 'dart:ffi';
// 省略MyStruct的FFI定义

// 假设listObject是你已有的长度为12的List<double>数据
final List<double> listObject = [/* 你的12个浮点数值 */];

// 遍历逐元素写入,注意数组长度要和@Array.multi声明的长度12匹配
for (int i = 0; i < 12; i++) {
  // 赋值时Dart会自动将double转为C侧要求的32位Float类型,无需手动转换
  myStructObject.states[i] = listObject[i];
}

// 赋值完成后即可正常将结构体传给C++接口调用
注意事项
  • 写入前请确认源List长度和Array声明的固定长度一致,避免下标越界写入非法内存
  • 此处的Float必须是dart:ffi包下的类型,不要误用Dart其他库中的同名类型
  • 永远不要尝试直接给states字段整体赋值对象,该字段直接映射原生内存偏移,仅支持通过下标操作内部元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.18 16:15:45