从C ++填充节点v8 Float32Array

时间:2016-02-03 19:40:17

标签: javascript c++ node.js v8 node.js-addon

我查看了文档:

我正在尝试使用thrust::host_vectofr<float>填充v8数组的浮点数,其中dataset[i].vector = thrust::host_vector<float>

使用数组,似乎是四舍五入到整数:

Local<Object> obj = Object::New(isolate);
Local<Array> vec = Array::New(isolate, dataset[i].vector.size());

// populate the v8 array (copy)
for (unsigned int k = 0; k < dataset[i].vector.size(); k++)
    vec->Set(k, Number::New(isolate, dataset[i].vector[k]));

obj->Set(String::NewFromUtf8(isolate, "vector"), vec);

使用类型数组,Float32Array

Local<Object> obj = Object::New(isolate);
auto vec = Float32Array::New(ArrayBuffer::New(isolate, sizeof(float)), 0, dataset[i].vector.size());

// populate the v8 array (copy)
for (unsigned int k = 0; k < dataset[i].vector.size(); k++)
    vec->Set(k, Number::New(isolate, dataset[i].vector[k]));

obj->Set(String::NewFromUtf8(isolate, "vector"), vec);

编译正常,但在执行时崩溃:

*** Error in `node': corrupted double-linked list: 0x000000000734bf50 ***
fish: “node run.js” terminated by signal SIGABRT (Abort)

从C ++分配然后填充v8 Float32Array的正确的方法是什么,以便可以在JavaScript中使用?

我也理解Node.JS / v8没有附带float

1 个答案:

答案 0 :(得分:1)

我不确定V8的版本是什么(在我看到的API文档中调用没有上下文的Set),但在4.10上,这样可以正常工作:

auto arr = v8::Array::New(isolate);
(void)arr->Set(context, 0, v8::Number::New(isolate, 2.5));
auto number = arr->Get(context, 0);
printf("%s\n", *v8::String::Utf8Value(number.ToLocalChecked()));

打印出来

2.5

将其转换为浮点值也有效:

printf("%f\n", ((v8::Number*)*number.ToLocalChecked())->Value());