FlasCC: взаимодействие между Vector. & Lt; Number & gt; и двойной []

Предположим, что я новичок в 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 в C ++ дважды, используя 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);
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector