2017-10-18 2 views
0

J'ai regardé un site web WebAssembly et des tutoriels et je me sens un peu perdu.Comment passer une chaîne à un code C compilé avec emscripten pour WebAssembly

Je le code C suivant:

void EMSCRIPTEN_KEEPALIVE hello(char * value){ 
    printf("%s\n", value); 
} 

Je l'ai compilé avec (je suis pas non plus que cette partie est la meilleure façon d'aller):

emcc demo.c -s WASM=1 -s NO_EXIT_RUNTIME=1 -o demo.js 

D'après ce que je comprends Je peux maintenant utiliser le code de colle demo.js dans ma classe javascript et appeler la méthode de cette façon:

... 
<script src="demo.js"></script> 
<script> 
    function hello(){   
     // Get the value 
     var value = document.getElementById("sample"); 
     _hello(value.innerHTML); 
    } 
</script> 
... 

ce que je vois bei ng imprimé dans la console quand je l'appelle la méthode est:

(null) 

Y at-il quelque chose que je manque de passer une valeur de chaîne au code C compilé avec WebAssembly?

Merci beaucoup

+1

Quels sont 'hello' et' _stringify' et où les appelez-vous? – Bergi

+0

c'est une faute de frappe, il devrait être _hello (value.innerHTML), j'ai édité la question, désolé pour cela – ElCapitaine

+0

Notez que vous devez exporter des fonctions pour pouvoir les appeler à partir de js: 'emcc demo.c -01 -s EXPORTED_FUNCTIONS = "['_ main', '_hello'] -o demo.js" 'Aussi ne vous sentez pas mal de la lutte, tout cela est nouveau et en développement lourd et les documents sont nécessairement incomplètes et périmées. –

Répondre

1

J'ai effectivement trouvé une réponse à ma question. J'ai simplement dû utiliser les fonctions qu'Emscripten construit automatiquement dans le code 'Glue' qui est également généré lorsque vous construisez votre code C++ sur WASM.

Donc, en gros, pour passer d'une chaîne à code C++ compilé WebAssembly avec emscripten vous faites simplement comme ceci:

// Create a pointer using the 'Glue' method and the String value 
var ptr = allocate(intArrayFromString(myStrValue), 'i8', ALLOC_NORMAL); 

// Call the method passing the pointer 
val retPtr = _hello(ptr); 

// Retransform back your pointer to string using 'Glue' method 
var resValue = Pointer_stringify(retPtr); 

// Free the memory allocated by 'allocate' 
_free(ptr); 

Des informations plus complètes sur Emscripten's page.