首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FlasCC: Vector.<Number>和double[]之间的互操作

FlasCC: Vector.<Number>和double[]之间的互操作
EN

Stack Overflow用户
提问于 2013-02-15 00:29:45
回答 1查看 573关注 0票数 1

假设我刚接触AS3和FlasCC,并尝试将一些遗留的C++代码移植到闪存中。我拥有的是一些处理数字的例程,它接受一个double类型的数组(数组的大小是固定的)。例如,C++原型是:

代码语言:javascript
复制
double doNumberCrunching(double input[512]);

现在,我想构建一个SWC,然后从AS3调用doNumberCrunching()。SWIG将AS3界面生成为:

代码语言:javascript
复制
doNumberCrunching(var _input:*):Number;

但是,我不知道如何在不处理原始字节的情况下为它提供Vector.<Number>(512)

我的问题是:如何巧妙地解决它?你知道一种廉价的方式来访问Vector.<Number>底层的double*吗?或者更好的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-13 13:33:35

如果你的数字运算函数是在整型数上运行的话!然后,您就可以使用CModule.writeIntVector将矢量内容写入DomainMemory,只需传递指向C++代码的指针即可。

但是因为它是双精度的,所以你必须遍历向量,并使用CModule.writeDouble将每个元素从AS3数字转换为C++双精度。然后,您可以通过一个接受DomainMemory指针的接口将您的函数手动公开给AS3:

代码语言:javascript
复制
void doNumberCrunchingAS() __attribute__((used,
  annotate("as3sig:public function doNumberCrunching(inputPtr:int):Number"),
  annotate("as3package:mypackage"))
));

double doNumberCrunching( double* input )
{
  // Actual implementation here
  return 0;
}

void doNumberCrunchingAS()
{
  // Read the AS3 argument and convert it to a convenient C++ form.
  int memoryOffset = 0;
  AS3_GetScalarFromVar(memoryOffset, inputPtr);
  double* inputPtr = reinterpret_cast<double*>( memoryOffset );

  // Call an implementation routine.
  double result = doNumberCrunching( inputPtr );

  // Return result to AS3 code.
  AS3_Return( result );
}

AS3代码:

代码语言:javascript
复制
package
{
  using mypackage.doNumberCrunching;

  function testNumberCrunching():void
  {
    var ptr:int = CModule.malloc(blobSize);

    // a loop of writeDouble should be here

    doNumberCrunching(ptr);

    CModule.free(ptr);
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14879502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档