本机 Node.JS 模块 - 从参数解析 int[]
Native Node.JS module - parsing an int[] from arguments
我正在尝试编写一个本机 C++ 模块以包含在 Node.js 项目中——我遵循了指南 here 并且设置得很好。
总体思路是我想将一个整数数组传递给我的 C++ 模块进行排序;然后模块 returns 排序数组。
但是,我无法使用 node-gyp build
进行编译,因为我遇到了以下错误:
error: no viable conversion from 'Local' to 'int *'
它在我的 C++ 中抱怨这段代码:
void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
int* inputArray = args[0]; // <-- ERROR!
sort(inputArray, 0, sizeof(inputArray) - 1);
args.GetReturnValue().Set(inputArray);
}
这一切对我来说都是概念上的意义——编译器不能神奇地将 arg[0]
(大概是 v8::Local
类型)转换为 int*
。话虽如此,我似乎无法找到任何方法将我的参数成功转换为 C++ 整数数组。
要知道我的C++比较生疏,对V8更是一窍不通。谁能指出我正确的方向?
这并不简单:您首先需要将 JS 数组(内部表示为 v8::Array
)解压缩为可排序的内容(如 std::vector
),对其进行排序,然后将其转换回JS数组。
这是一个例子:
void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
// Make sure there is an argument.
if (args.Length() != 1) {
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Need an argument")));
return;
}
// Make sure it's an array.
if (! args[0]->IsArray()) {
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "First argument needs to be an array")));
return;
}
// Unpack JS array into a std::vector
std::vector<int> values;
Local<Array> input = Local<Array>::Cast(args[0]);
unsigned int numValues = input->Length();
for (unsigned int i = 0; i < numValues; i++) {
values.push_back(input->Get(i)->NumberValue());
}
// Sort the vector.
std::sort(values.begin(), values.end());
// Create a new JS array from the vector.
Local<Array> result = Array::New(isolate);
for (unsigned int i = 0; i < numValues; i++ ) {
result->Set(i, Number::New(isolate, values[i]));
}
// Return it.
args.GetReturnValue().Set(result);
}
免责声明:我不是 v8 向导,也不是 C++ 向导,所以可能有更好的方法来做到这一点。
我正在尝试编写一个本机 C++ 模块以包含在 Node.js 项目中——我遵循了指南 here 并且设置得很好。
总体思路是我想将一个整数数组传递给我的 C++ 模块进行排序;然后模块 returns 排序数组。
但是,我无法使用 node-gyp build
进行编译,因为我遇到了以下错误:
error: no viable conversion from 'Local' to 'int *'
它在我的 C++ 中抱怨这段代码:
void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
int* inputArray = args[0]; // <-- ERROR!
sort(inputArray, 0, sizeof(inputArray) - 1);
args.GetReturnValue().Set(inputArray);
}
这一切对我来说都是概念上的意义——编译器不能神奇地将 arg[0]
(大概是 v8::Local
类型)转换为 int*
。话虽如此,我似乎无法找到任何方法将我的参数成功转换为 C++ 整数数组。
要知道我的C++比较生疏,对V8更是一窍不通。谁能指出我正确的方向?
这并不简单:您首先需要将 JS 数组(内部表示为 v8::Array
)解压缩为可排序的内容(如 std::vector
),对其进行排序,然后将其转换回JS数组。
这是一个例子:
void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
// Make sure there is an argument.
if (args.Length() != 1) {
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Need an argument")));
return;
}
// Make sure it's an array.
if (! args[0]->IsArray()) {
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "First argument needs to be an array")));
return;
}
// Unpack JS array into a std::vector
std::vector<int> values;
Local<Array> input = Local<Array>::Cast(args[0]);
unsigned int numValues = input->Length();
for (unsigned int i = 0; i < numValues; i++) {
values.push_back(input->Get(i)->NumberValue());
}
// Sort the vector.
std::sort(values.begin(), values.end());
// Create a new JS array from the vector.
Local<Array> result = Array::New(isolate);
for (unsigned int i = 0; i < numValues; i++ ) {
result->Set(i, Number::New(isolate, values[i]));
}
// Return it.
args.GetReturnValue().Set(result);
}
免责声明:我不是 v8 向导,也不是 C++ 向导,所以可能有更好的方法来做到这一点。