node.js — узел C ++ Addon — как получить доступ к типизированному массиву (Float32Array), когда он был передан в качестве аргумента?

Я хотел бы использовать структуру данных V8 Float32Array. Как я могу инициализировать это?

Я также был бы заинтересован в прямом доступе к памяти данных. Как это можно сделать?

4

Решение

обновленный

Лучший способ сейчас — использовать помощника Nan::TypedArrayContents.

assert(args[i]->IsFloat32Array());
Local<Float32Array> myarr = args[i].As<Float32Array>();
Nan::TypedArrayContents<float32_t> dest(myarr);
// Now use dest, e.g. (*dest)[0]

Есть хороший пример этого в Узел-холст.


Оригинальный ответ, который показывает, почему помощник полезен

API v8 быстро меняется прямо сейчас, так что это зависит от вашей версии node / io.js. Чтобы получить доступ к данным из массива, предоставленного в качестве аргумента, это должно работать для узла 0.12 через io.js <3,0:

assert(args[i]->IsFloat32Array()); // These type-check methods are available.
Local<Float32Array> myarr = args[i].As<Float32Array>();
void* dataPtr = myarr->GetIndexedPropertiesExternalArrayData();

В io.js> = 3.0 (v8 4.3) вы должны вместо этого использовать ArrayBuffer::GetContents, (Я еще не использовал это и обновлю это, когда выйдет 3.0.) Документы Вот.

В узле 0.10 TypedArrays были домашними. Это был один из способов сделать это:

Local<Object> buffer = args[i]->Get(NanNew("buffer"))->ToObject();
void* dataPtr = buffer->GetPointerFromInternalField(0);

Построение типизированного массива можно выполнить с помощью:

 Float32Array::New(ArrayBuffer::New(Isolate::GetCurrent(), size * 4), 0, size);
5

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


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