【问题标题】:How to get a sum of values in array in Google Native Client inside C++?如何在 C++ 中的 Google Native Client 中获取数组中的值总和?
【发布时间】:2013-07-26 19:59:54
【问题描述】:

在我的 HTML 中
假设我有 2 个输入字段,值为 3 和 4:

<form onchange="reload()">
  <h2>Input:</h2>
  <input type="number" id="val1" name="val1" value="3">
  <input type="number" id="val2" name="val2" value="4">
  <br><br>
  <h2>Output</h2>
  <input type="text" id="out" name="out" value="untouched by C++"><br>
</form>

在我的 JavaScript 中
我得到这两个值并将它们推入一个数组,如下所示:

Module = document.getElementById('module');
var msg = [];
msg.push(Number(document.getElementById('val1').value));
msg.push(Number(document.getElementById('val2').value));

然后我将它发送到我的 C++ 文件以处理消息

Module.postMessage(msg);

在我的 C++ 文件中 [ 这是我卡住的地方。 ]
我必须处理消息的代码如下

virtual void HandleMessage(const pp::Var& var_message) {
  std::string message = var_message.AsString();
  pp::Var var_reply = pp::Var(message);
  PostMessage(var_reply);
}

问题在于它处理 string [如果我的 msg 是数组类型,它实际上会崩溃]。

我希望它期待和接受的是一个数组或一个对象
基本上是这样的:

virtual void HandleMessage(const pp::Var& var_message) {
  pp::Var var_reply =  var_message[0] + var_messgae[1]; // I expect this to be 3+4=7
  PostMessage(var_reply);
}

谁能帮我弄清楚如何在我的 C++ 中从 JavaScript 中获取数组或对象,以便我可以一起计算值并将结果发送回 JavaScript?

【问题讨论】:

    标签: javascript c++ arrays message google-nativeclient


    【解决方案1】:

    我已经解决了我遇到的问题。最好的方法是使用一个对象并将值作为 JSON 对象传递,所以

    在 JavaScript 中

    values = {
            "val1": Number(document.getElementById('val1').value),
            "val2": Number(document.getElementById('val2').value)
        };
    msg = JSON.stringify(values);
    Module.postMessage(msg);
    

    然后处理消息并将响应发送回 JavaScript

    在 C++ 中:

    在标题中,您需要添加 picoJSON 来处理 JSON 和 sstream 以使用 isstringstream

    #include <sstream>
    #include "picojson.h"
    using namespace std;
    

    然后在后面的代码中:

    virtual void HandleMessage(const pp::Var& var_message) {
    
            picojson::value v;
    
            // pass the message that was sent from JavaScript as a string
            // var_message.AsString() will be in form "{\"val1\":4,\"val2\":4}");
            // and convert it to istringstream
    
            istringstream iss2((string)var_message.AsString());
    
            // parse iss2 and extract the values val1 and val2
            string err = picojson::parse(v, iss2);
    
            int val1 = (int)v.get("val1").get<double>();
            int val2 = (int)v.get("val2").get<double>();
    
            // finally send the message and you'll see the sum in the JavaScript
            PostMessage( val1 + val2 );
    
      }
    

    【讨论】:

      【解决方案2】:

      文档尚未更新,但截至pepper_29,现在有一个pp::VarArray 接口用于访问数组。

      可以看到新C++接口here的头文件。

      这是你如何使用它(未经测试):

      virtual void HandleMessage(const pp::Var& var_message) {
        if (!var_message.is_array()) return;
      
        pp::VarArray array(var_message);
      
        // Do some stuff with the array...
        uint32_t length = array.GetLength();
        double sum = 0;
        for (uint32_t i = 0; i < length; ++i) {
           pp::Var element = array.Get(i);
           if (element.is_number()) {
             sum += element.AsDouble();
           }
        }
      
        pp::Var var_reply(sum);
        PostMessage(var_reply);
      }
      

      【讨论】:

        【解决方案3】:

        我有同样的问题,我想发送一个字符串数组

        var nativeArray = new Array();
        nativeArray[0] = "Item 1"
        nativeArray[1] = "Item 2"
        naclModuleElement.postMessage(nativeArray)
        

        HandleMessage 中没有调用任何内容

        发送 nativeArray.length 有效并在 NaCl 端显示“2”

        经过一番调查,我发现AsArray() 类中没有AsArray() 函数

        只有基元可用

        有一个类 pp:VarArrayBuffer 可用于发送/接收二进制信息。this 可以提供帮助(虽然没有下载其中发布的示例)

        【讨论】:

        • 我已经看到了 pp:VarArrayBuffer 但不明白如何使用它。此外,和你一样,我注意到没有“AsArray()”。最可悲的是缺乏例子。
        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        • 2013-09-20
        相关资源
        最近更新 更多