5

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?

Community
  • 1
  • 1
Philipp
  • 2,376
  • 5
  • 29
  • 47

1 Answers1

4

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

John Sharp
  • 801
  • 4
  • 5