On Fri, Apr 8, 2016 at 6:51 AM, Brion Vibber <[email protected]> wrote:

> On Fri, Apr 8, 2016 at 2:13 PM, Ziyuan Lin <[email protected]> wrote:
>
>> I want to create an array of structs in JavaScript via Emscripten's
>> interfaces:
>> [snip]
>>
>> // minimal.html
>> <script type="text/javascript" src="minimal.em.js" charset="utf-8"></script>
>> <script type="text/javascript">
>>     var pointVec = new Module.PointVec();
>> </script>
>>
>>
>> The browser will complain Uncaught TypeError: Module.PointVec is not a
>> constructor.
>>
>
> Your code is probably being run before the module is fully initialized.
>

Building with -s ASSERTIONS=1 can verify that, it will abort on such an
error.


>
> If I'm reading the docs/code correctly, you'll want to put a callback on
> Module.onRuntimeInitialized, something like this:
>
> <script type="text/javascript">
> Module = {
>   onRuntimeInitialized: function() {
>     var pointVec = new Module.PointVec();
>   }
> };
> </script>
> <script type="text/javascript" src="minimal.em.js" charset="utf-8"></script>
>
>
> Alternately there's a build option to disable the memory init file, which
> will force the memory initialization to live in the JS code and load
> synchronously (at the cost of larger file sizes).
>
> To try that, add "--memory-init-file 0" into your em++ invocation.
>
> But interestingly I can actually run var pointVec = new Module.PointVec(); in
>> the browser's console (Chrome's, for example), but I cannot set the
>> entries. Log:
>>
>>
>> x Uncaught TypeError: Module.PointVec is not a constructor
>> > var pointVec = new Module.PointVec()
>> < undefined
>> > pointVec
>> < PointVec {$$: Object}
>> > pointVec.set(0, {'x': 0, 'y': 0})
>> < true
>> > pointVec.get(0)
>> < undefined
>>
>>
>
> C++'s std::vector doesn't seem to allow you to use the [] = operators to
> set an element value that's out of range; set() and get() seem to map to []
> = and [] so I think the same limitation applies. Try using push_back()
> instead, which will add an element to the end:
>
> pointVec.push_back({x: 0, y: 0});
>
> To change an existing element in the vector you can use set() and it
> should work; it just won't work to add new elements.
>
> -- brion
>
> --
> You received this message because you are subscribed to the Google Groups
> "emscripten-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to