代码之家  ›  专栏  ›  技术社区  ›  Ælex

从C填充节点v8 Float32Array++

  •  1
  • Ælex  · 技术社区  · 9 年前

    我查看了文档:

    我正在尝试使用 thrust::host_vectofr<float> 哪里 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++分配并填充v8Float32Array,以便它可以在JavaScript中使用?

    我也理解这个节点。JS/v8不附带 float ?

    1 回复  |  直到 8 年前
        1
  •  1
  •   xaxxon    9 年前

    我不确定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());