Предположим, что я новичок в 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>
? Или что-то еще лучше?
Если бы только ваша функция обработки чисел работала с целыми числами! Тогда вы сможете использовать 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);
}
}
Других решений пока нет …