При загрузке нескольких массивов TypedArrayContents в массив v8 как элементы (массив массивов) последний элемент перезаписывает все элементы - PullRequest
0 голосов
/ 10 мая 2019

Я пишу дополнение C ++ к node.js. Я хочу обработать и объединить большое количество данных в массив массивов для передачи из процесса C ++ обратно в js. Я узнал, что NAN предоставляет вспомогательный класс v8 с именем TypedArrayContents, который позволяет мне напрямую обращаться к массиву Float32Array v8 через указатель.

v8::Local<Float32Array> tempHeatmap = v8::Float32Array::New(
        v8::ArrayBuffer::New(isolate, 4 * DIMENSIONS), 0, DIMENSIONS);

Nan::TypedArrayContents<float> dest(tempHeatmap);

for (int i = 0; i < heatmapCollection.size(); i++) {
        v8::Local<Array> sensorDataArray =
            Local<Array>::Cast(parentData->Get(i + 1));

        for (int a = 0; a < nodeCount; a++) {
            sensorDataVec[a] = sensorDataArray->Get(a)->NumberValue();
        }

        for (int j = 0; j < DIMENSIONS; j++) {
            float num = 0.0, denom = 0.0;
            for (int k = 0; k < nodeCount; k++) {
                if (heatmapGrid[j][k] == 0.0) {
                }
                else {

                    num += float(sensorDataVec[k]) / float(heatmapGrid[j][k]);

                    denom += 1 / float(heatmapGrid[j][k]);
                }
            }

            (*dest)[j] = num / denom;

        }
        returnHeatmapCollection->Set(i, tempHeatmap);

    }

returnHeatmapCollection - это массив v8, в котором элементы Float32Array хранятся как элементы. Я могу получить к нему доступ со стороны js без проблем.

Однако для каждого элемента в returnHeatmapCollection по умолчанию используется результат постобработки элемента last . Другими словами, если я сгенерирую 10 шаблонов tempHeatmap, 10-й загружается в каждый элемент в returnHeatmapArray через -> Set ().

Почему это произошло? Это имеет гораздо меньший смысл, чем если бы он по умолчанию использовал элемент first . Но тот факт, что последний элемент перезаписывает все предыдущие, указывает на то, что каждый предыдущий элемент каким-то образом изменяется каждый раз, когда я использую -> Установить. Как это может быть дело?

1 Ответ

0 голосов
/ 06 июня 2019

У вас есть один Float32Array (объявленный вне вашего for цикла), который вы устанавливаете для каждого индекса returnHeatmapCollection. Вам нужно сделать новый Float32Array для каждого индекса.

...