【问题标题】:Dart/Flutter FFI: Convert List to ArrayDart/Flutter FFI:将列表转换为数组
【发布时间】:2022-01-20 08:00:45
【问题描述】:

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

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

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

以下转换在运行时失败。

myStructObject.states = listObject as Array<Float>;

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

【问题讨论】:

    标签: c++ flutter dart ffi dart-ffi


    【解决方案1】:

    没有办法绕过将元素复制到 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&lt;T&gt; 特化定义单独的扩展方法(Array&lt;Uint32&gt;Array&lt;Double&gt;Array&lt;Bool&gt; 等)。 这是因为 [] 运算符在内部通过单独的扩展方法实现这些类型特化中的每一个。

    【讨论】:

    • 我也尝试过的第一种方法。它给了我错误。扩展方法的第二种方法奏效了。谢谢。
    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 2020-07-03
    • 2023-01-03
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多