1

私は AS3 と FlasCC の初心者で、一部のレガシー C++ コードを Flash に移植しようとしているとします。私が持っているのは、型の配列を取るいくつかの数値演算ルーチンですdouble(配列は固定サイズです)。C++ プロトタイプは次のようになります。

double doNumberCrunching(double input[512]);

doNumberCrunching()ここで、SWC を構築し、後でAS3 から呼び出したいと考えています。SWIG は AS3 インターフェイスを次のように生成します。

doNumberCrunching(var _input:*):Number;

Vector.<Number>(512)ただし、生のバイトを処理せずにフィードする方法がわかりません。

私の質問は次のとおりです。それをきれいに解決するにはどうすればよいですか?double*の根底にあるにアクセスするための安価な方法を知っていますVector.<Number>か? それとももっと良いものですか?

4

1 に答える 1

0

あなたの数値処理関数だけが int で動作していれば! 次に、CModule.writeIntVector を使用してベクトルの内容をDomainMemoryに書き込み、ポインタを C++ コードに渡すだけです。

ただし、これは double であるため、Vector を反復処理し、各要素をCModule.writeDoubleを使用して AS3 Number から C++ double に変換する必要があります。次に、DomainMemory ポインターを受け入れるインターフェイスを使用して、関数を AS3 に手動で公開できます。

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 コード:

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);
  }
}
于 2013-03-13T05:33:35.163 に答える