Persistent dara across .oct-files

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Persistent dara across .oct-files

Felix Wolf
Hello everyone,

my colleague and I are working on a larger academic C++ code, which we
want to equip with octave wrappers such that it can be used by students.
For multiple reasons, we cannot port certain data structures to octave,
and we cannot pass certain data as copy between functions.

We found out, that under Ubuntu (bionic, Octave 4.2.2), this behavior
can be achieved via global variables in .oct-files, as can be seen from
the following minimal example:

init.cpp:

- - - - -

#include <octave/oct.h>

double my_const;

DEFUN_DLD(init, args, nargout, "init") {
    octave_stdout << &my_const << "\n";
    my_const = 42;
    octave_stdout << my_const << "\n";
  return octave_value_list();
}

extract.cpp:

- - - - -

#include <octave/oct.h>

extern double my_const;

DEFUN_DLD(extract, args, nargout, "extract") {
    octave_stdout << &my_const << "\n";
    octave_stdout << my_const << "\n";
    return octave_value(1);
}

- - - - -

These functions compile and run by calling

mkoctfile -std=c++11 init.cpp
mkoctfile -std=c++11 extract.cpp
init()
extract()

and, when called, return the same value and the same adress, for example

0x7f5b429c40c8
42
0x7f5b429c40c8
42

However, these files compile neither under Mac nor Windows. On Windows,
one cannot compile and run them as mentioned above, but by calling an
.m-file of the form

mkoctfile init.cpp
mkoctfile extract.cpp init.cpp
init()
extract()

but they do not yield the desired output. This brings me to the two
underlying questions we have.

1. Is the behavior of the example above under Ubuntu intended or a bug,
i.e., can we depend on it to be reproducable in upcoming versions?
2. Is there an elegant solution to make certain data structures persist
in memory across multiple .oct-files (for example, by passing a
reference/pointer to octave)?

Thank you for your time and assistance,

Felix Wolf




Reply | Threaded
Open this post in threaded view
|

Re: Persistent dara across .oct-files

Carlo de Falco-2


> On 10 Aug 2018, at 10:54, Felix Wolf <[hidden email]> wrote:
>
> Hello everyone,
>
> my colleague and I are working on a larger academic C++ code, which we
> want to equip with octave wrappers such that it can be used by students.
> For multiple reasons, we cannot port certain data structures to octave,
> and we cannot pass certain data as copy between functions.
>
> We found out, that under Ubuntu (bionic, Octave 4.2.2), this behavior
> can be achieved via global variables in .oct-files, as can be seen from
> the following minimal example:
>
> init.cpp:
>
> - - - - -
>
> #include <octave/oct.h>
>
> double my_const;
>
> DEFUN_DLD(init, args, nargout, "init") {
>     octave_stdout << &my_const << "\n";
>     my_const = 42;
>     octave_stdout << my_const << "\n";
>   return octave_value_list();
> }
>
> extract.cpp:
>
> - - - - -
>
> #include <octave/oct.h>
>
> extern double my_const;
>
> DEFUN_DLD(extract, args, nargout, "extract") {
>     octave_stdout << &my_const << "\n";
>     octave_stdout << my_const << "\n";
>     return octave_value(1);
> }
>
> - - - - -
>
> These functions compile and run by calling
>
> mkoctfile -std=c++11 init.cpp
> mkoctfile -std=c++11 extract.cpp
> init()
> extract()
>
> and, when called, return the same value and the same adress, for example
>
> 0x7f5b429c40c8
> 42
> 0x7f5b429c40c8
> 42
>
> However, these files compile neither under Mac nor Windows. On Windows,
> one cannot compile and run them as mentioned above, but by calling an
> .m-file of the form
>
> mkoctfile init.cpp
> mkoctfile extract.cpp init.cpp
> init()
> extract()
>
> but they do not yield the desired output. This brings me to the two
> underlying questions we have.
>
> 1. Is the behavior of the example above under Ubuntu intended or a bug,
> i.e., can we depend on it to be reproducable in upcoming versions?
> 2. Is there an elegant solution to make certain data structures persist
> in memory across multiple .oct-files (for example, by passing a
> reference/pointer to octave)?
>
> Thank you for your time and assistance,
>
> Felix Wolf



Hi Felix,

This behavious is not specific to Octave but related to how dynamic linking differs among platforms.
A workaround to make this working on macos is the following :

create a file named PKG_ADD with the following contents:

------
autoload init bundle.oct
autoload extract bundle.oct
------

then build your code with this command

------
mkoctfile init.cc extract.cc -o bundle.oct
------


then in Octave you get (tested with the development branch)

>> init
0x1149c0290
42
>> extract
0x1149c0290
42
ans =  1


HTH,
c.