FlasCC: взаимодействие между Vector.<Number> и double[]

Предположим, что я новичок в AS3 и FlasCC и попытаюсь перенести устаревший код C++ на Flash. То, что у меня есть, это некоторая процедура обработки чисел, которая принимает массив типа double (массив имеет фиксированный размер). Прототип C++, скажем:

double doNumberCrunching(double input[512]);

Теперь я хотел бы построить SWC и позже позвонить doNumberCrunching() от AS3. SWIG генерирует интерфейс AS3 как:

doNumberCrunching(var _input:*):Number;

Тем не менее, я понятия не имею, как кормить его Vector.<Number>(512) без работы с необработанными байтами.

Мой вопрос: как решить это аккуратно? Вы знаете дешевый способ доступа double* лежащий в основе Vector.<Number>? Или что-то еще лучше?

1 ответ

Решение

Если бы только ваша функция обработки чисел работала с целыми числами! Тогда вы сможете использовать CModule.writeIntVector для записи векторного содержимого в DomainMemory и просто передать указатель на код C++.

Но так как он удваивается, вам придется перебирать Vector и конвертировать каждый элемент из AS3 Number в C++ double, используя CModule.writeDouble. Затем вы можете вручную представить свою функцию для AS3 с интерфейсом, который принимает указатель DomainMemory:

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);
  }
}
Другие вопросы по тегам