1

我有一个从 C++ 库接收浮点类型数组的结构。

class MyStruct extends Struct{      
  @Array.multi([12])
  external Array<Float> states;
}

我能够接收数据并在 Dart 中解析它。现在我想做相反的事情。我有一个List<double>我想分配给这个结构并传递给 C++ 的。

以下强制转换在运行时失败。

myStructObject.states = listObject as Array<Float>;

Array 类和 List 类都没有任何相关的方法。对此有任何想法吗?

4

1 回答 1

2

没有办法绕过将元素复制到 FFI 数组中。

for (var i = 0; i < listObject.length; i++) {
  my_struct.states[i] = listObject[i];
}

这可能看起来效率低下,但考虑到根据 的专业化listObject,数据的底层内存布局可能与连续 FFI 布局有很大不同,因此 Dart 提供的类型转换糖可能还需要对单个元素执行转换(而不是仅仅memcpy在引擎盖下执行一个单一的)。

缩小便利性差距的一种可能性是定义扩展方法。例如:

extension FloatArrayFill<T> on ffi.Array<ffi.Float> {
  void fillFromList(List<T> list) {
    for (var i = 0; i < list.length; i++) {
      this[i] = list[i] as double;
    }
  }
}

用法:

my_struct.states.fillFromList(list);

请注意,需要为ffi.Array<T>您想要为 ( Array<Uint32>Array<Double>Array<Bool>等) 执行此操作的每个专业定义单独的扩展方法。这是由于在[]内部通过单独的扩展方法为这些类型特化中的每一个实现了操作符。

于 2022-01-20T11:46:32.467 回答