Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass array to C function with emscripten

I think this question is similar to this one and I used most of it's answer for my problem, but I still have issues:

First the C code:

#include <stdio.h>

extern "C"
{
    void fillArray(int* a, int len)
    {
        for (int i = 0; i<len; i++)
        {
            a[i] = i*i;
        }

        for (int j = 0; j < len; ++j)
        {
            printf("a[%d] = %d\n", j, a[j]);
        }
    }
}

I'm passing a pointer to an array to my C function and fill it with some information. I compile this code with

emcc -o writebmp.js dummyCode\cwrapCall.cxx -s EXPORTED_FUNCTIONS="['_fillArray']"

My html/js code is the following:

<!doctype html>
<html>
  <script src="writebmp.js"></script>
  <script>
    fillArray = Module.cwrap('fillArray', null, ['number', 'number']);
    var nByte = 4
    var length = 20;
    var buffer = Module._malloc(length*nByte);
    fillArray(buffer, length);
    for (var i = 0; i < length; i++)
    {
        console.log(Module.getValue(buffer+i*nByte));
    }
  </script>
</html>

When I run the script the output I get is correct until the 12th element, after that it is garbage. Is the buffer I malloc too small?

like image 351
Philipp Avatar asked Aug 11 '26 06:08

Philipp


1 Answers

Module.getValue takes an optional second argument, denoting the type that the 'pointer' should be dereferenced as and by default this is 'i8', meaning the 32 bit signed integers are being dereferenced as 8 bit integers and so you're not getting garbage, but wrap around errors.

Fixing this is simple, you just need to specify that the 'pointer' passed to Module.getValue should be dereferenced as a 32 bit signed integer:

console.log(Module.getValue(buffer+i*nByte, 'i32'));

It might be safer and clearer to change the declaration of fillArray to

#include <stdint.h>

void fillArray(int32_t* a, int32_t len)

The revelant section of the emscripten docs can be found here

like image 193
John Sharp Avatar answered Aug 13 '26 00:08

John Sharp