/ / सी + + और जावास्क्रिप्ट के बीच स्ट्रिंग को पास कैसे करें

Emscripten के माध्यम से C ++ और जावास्क्रिप्ट के बीच तारों को कैसे पारित करें - जावास्क्रिप्ट, सी ++, emscripten

मैं एम्सस्क्रिप्टेन सीख रहा हूं, और मैं "सी + + और जेएस के बीच तार गुजरने पर भी सबसे बुनियादी स्ट्रिंग हेरफेर काम नहीं कर सकता।

उदाहरण के लिए, मैं एक स्ट्रिंग लंबाई फ़ंक्शन लिखना चाहूंगा। C ++ में:

extern "C" int stringLen(std::string p)
{
return p.length();
}

जावास्क्रिप्ट के रूप में कहा जाता है:

var len = _stringLen("hi.");

यह प्रदान करता है 0 मेरे लिए। मैं इस काम को उम्मीद के मुताबिक कैसे करूं? मुझे किस स्ट्रिंग प्रकार का उपयोग करना चाहिए? char const*? std::wstring? std::string? किसी को काम नहीं लगता; मुझे हमेशा सुंदर यादृच्छिक मूल्य मिलते हैं।

यह केवल शुरुआत है ... फिर मैं कैसे करूं वापसी इस तरह से सी ++ से एक स्ट्रिंग?

extern "C" char *stringTest()
{
return "...";
}

और जेएस में:

var str = _stringTest();

फिर, मुझे यह काम करने का कोई तरीका नहीं मिल रहा है; मुझे हमेशा जेएस में कचरा मिलता है।

तो मेरा प्रश्न स्पष्ट रूप से है: मैं Emscripten के माध्यम से JS और C ++ के बीच के तार प्रकार कैसे बदल सकता हूँ?

उत्तर:

उत्तर № 1 के लिए 6

बाहरी "C" doesn "t पहचान std :: string

आप इसे आज़माना चाहते हैं:
Test.cpp

#include <emscripten.h>
#include <string.h>

extern "C" int stringLen(char* p)
{
return strlen(p);
}

Cpp कोड संकलित करने के लिए निम्नलिखित कमांड का उपयोग करें:

emcc Test.cpp -s EXPORTED_FUNCTIONS="["_stringLen"]

नमूना परीक्षण कोड:
Test.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Hello World !</title>
<script src="a.out.js"></script>
<script>
var strLenFunction =  Module.cwrap("stringLen", "number", ["string"]);
var len1 = strLenFunction("hi.");  // alerts 3
alert(len1);
var len2 = strLenFunction("Hello World"); // alerts 11
alert(len2);
</script>
</head>
</html>

जवाब के लिए 2 № 2

यदि आप एक फ़ंक्शन के साथ बाहरी "C" का उपयोग करते हैं, तो आप इसमें C ++ प्रकार का उपयोग नहीं कर सकते।

इसलिए यदि आप std :: string का उपयोग करना चाहते हैं, तो आप "Embind" या "WebIDL Binder" का उपयोग कर सकते हैं। देखें यहाँ

मैं आलिंगन पसंद करता हूं, इसलिए यह आपकी समस्या का एक नमूना कोड है।

पी। मुझे यकीन नहीं है कि यहाँ संदर्भ द्वारा चर कैसे पारित किया जाए, इसलिए इसे मूल्य के आधार पर करना।

// This is your routine C++ code
size_t MyStrLen(std::string inStr) {
return inStr.length();
}

// This is the extra code you need to write to expose your function to JS
EMSCRIPTEN_BINDINGS(my_module) {
function("MyStrLen", &MyStrLen);
}

अब JS में आपको बस इतना करना है:

var myStr = "TestString";
Module.MyStrLen(myStr);

सुनिश्चित करें कि आप ध्वज को पास करते हैं

--bind

जब ईमेक कॉल करना।

वहाँ है एक और दृष्टिकोण जहाँ आप JS से C ++ हीप पर एक Malloc कर सकते हैं और फिर जोड़तोड़ कर सकते हैं, लेकिन उपरोक्त दृष्टिकोण आसान होना चाहिए।


जवाब के लिए 0 № 3

कुछ विचार:

  1. एकमात्र तरीका जिसे मैंने कहा है वह एक तरीका है crwap या ccall?
    var length = Module.ccall("stringLen", ["string"], "number");
  2. क्या आप भी शामिल हैं? stringLen तथा stringTest आपके में EXPORTED_FUNCTIONS पैरामीटर?
    emcc hello_world.cpp ... -s EXPORTED_FUNCTIONS=["_stringLen","_stringTest"]

अधिक जानकारी के लिए यहां देखें:
http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html

या मेरा हैलो_वर्ल्ड ट्यूटोरियल:
http://www.brightdigit.com/hello-emscripten/

उम्मीद है कि मदद करता है।