[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Calling Octave from C++
From: |
Tatsuro MATSUOKA |
Subject: |
Re: Calling Octave from C++ |
Date: |
Tue, 27 Mar 2018 15:08:32 +0900 (JST) |
----- Original Message -----
>> From: Mike Miller
>> To: help-octave
>> Cc:
>> Date: 2018/3/27, Tue 13:51
>> Subject: Re: Calling Octave from C++
>>
>> On Tue, Mar 27, 2018 at 13:39:26 +0900, Tatsuro MATSUOKA wrote:
>>> For me something seems wrong with octave-4.2.2.
>>> Upcoming 4.4 (now still 4.3.0+), code rewrite as indicated by Mike,
>>> problem seems to be solved.
>>
>> As I tried to show in my last message, the example is different for
>> Octave 4.2 vs 4.4.
>>
>> In Octave 4.2, you need to initialize the interpreter with
>>
>> string_vector argv (2);
>> argv(0) = "embedded";
>> argv(1) = "-q";
>> octave_main (2, argv.c_str_vec (), 1);
>>
>> In Octave 4.4, you need to initialize the interpreter with
>>
>> octave::interpreter interpreter;
>> int status = interpreter.execute ();
>>
>> --
>> mike
>
> Thanks Mike. That worked.
>
> #include <iostream>
> #include <octave/oct.h>
> #include <octave/octave.h>
> #include <octave/parse.h>
> #include <octave/interpreter.h>
>
> int
> main (void)
> {
> string_vector argv (2);
> argv(0) = "test_01_03";
> argv(1) = "-q";
> octave_main (2, argv.c_str_vec (), 1);
>
> octave_value_list in;
>
> // THIS CODE IS WORKING
> int qq =10;
> int rr =15;
> in(0) = octave_value(qq);
> in(1) = octave_value(rr);
> octave_value_list out = feval ("gcd", in, 1);
> std::cout << out(0).int_value ()
> << std::endl;
> return 0;
> }
>
> the above worked
>
> #include <iostream>
> #include <octave/oct.h>
> #include <octave/octave.h>
> #include <octave/parse.h>
> #include <octave/interpreter.h>
>
> int
> main (void)
> {
> string_vector argv (2);
> argv(0) = "test_02";
> argv(1) = "-q";
> octave_main (2, argv.c_str_vec (), 1);
>
> octave_value_list in;
>
> // THIS CODE IS NOT WORKING
> int qq =10;
> int rr =15;
> in(0) = octave_value(qq);
> in(1) = octave_value(rr);
> octave_value_list out = feval ("pp", in, 1);
> std::cout << out(0).int_value ()
> << std::endl;
> return 0;
> }
>
> the above hanged as original author (Andrea) told,
>
> $ LC_ALL=C gdb ./test_02
>
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library
> "/lib/x86_64-linux-gnu/libthread_db.so.1".
> [New Thread 0x7fffe3cae700 (LWP 4060)]
> [New Thread 0x7fffe14ad700 (LWP 4061)]
> [New Thread 0x7fffdecac700 (LWP 4062)]
> [New Thread 0x7fffdc4ab700 (LWP 4063)]
> [New Thread 0x7fffd9caa700 (LWP 4064)]
> [New Thread 0x7fffd94a9700 (LWP 4065)]
> [New Thread 0x7fffd4ca8700 (LWP 4066)]
>
> Thread 1 "test_02" received signal SIGSEGV, Segmentation fault.
> tree_statement_list::accept (this=0xa4dc30, tw=...)
> at ../libinterp/parse-tree/pt-stmt.cc:326
> 326 tw.visit_statement_list (*this);
> (gdb) bt
> #0 tree_statement_list::accept (this=0xa4dc30, tw=...)
> at ../libinterp/parse-tree/pt-stmt.cc:326
> #1 0x00007ffff731e106 in octave_user_function::do_multi_index_op (
> this=0x7c1d80, nargout=1, _args=..., lvalue_list=0x0)
> at ../libinterp/octave-value/ov-usr-fcn.cc:610
> #2 0x00007ffff7317b84 in octave_user_function::do_multi_index_op (
> this=<optimized out>, nargout=<optimized out>, args=...)
> at ../libinterp/octave-value/ov-usr-fcn.cc:461
> #3 0x00007ffff73218e5 in octave_value::do_multi_index_op (
> address@hidden, address@hidden, idx=...)
> at ../libinterp/octave-value/ov.cc:1529
> #4 0x00007ffff73aa69b in feval (name="pp", args=...,
> address@hidden)
> at libinterp/parse-tree/oct-parse.yy:4807
> #5 0x0000000000401d72 in main () at test_02.cc:22
> (gdb) s
> Couldn't get registers: No such process.
> Couldn't get registers: No such process.
> Couldn't get registers: No such process.
> (gdb) [Thread 0x7fffd4ca8700 (LWP 4066) exited]
> [Thread 0x7fffd94a9700 (LWP 4065) exited]
> [Thread 0x7fffd9caa700 (LWP 4064) exited]
> [Thread 0x7fffdc4ab700 (LWP 4063) exited]
> [Thread 0x7fffdecac700 (LWP 4062) exited]
> [Thread 0x7fffe14ad700 (LWP 4061) exited]
> [Thread 0x7fffe3cae700 (LWP 4060) exited]
>
> Tatsuro
Andrea
With Mike's helps, I could reproduce what you met.
Perhaps 4.2.2 is the last release for octave 4.2.
Realistic solutions are: (just my idea)
1. Wait until octave 4.4 will be released.
2. Build current stable (now 4.3.0+).
For 2., you need to install mercurial and (autotools (autoconf, automake)).
$ hg clone https://www.octave.org/hg/octave
$ cd octave
$ hg update stable
(Once you clone, you need hg pull && hg update stable)
$ ./bootstrap
Then configure script is generated and you can build in the same way as
release version.
HTH
Tatsuro
- Re: Calling Octave from C++, (continued)
- Re: Calling Octave from C++, Tatsuro MATSUOKA, 2018/03/24
- Re: Calling Octave from C++, andrea.delbravo, 2018/03/24
- Re: Calling Octave from C++, Tatsuro MATSUOKA, 2018/03/25
- Re: Calling Octave from C++, Tatsuro MATSUOKA, 2018/03/26
- Re: Calling Octave from C++, Mike Miller, 2018/03/26
- Re: Calling Octave from C++, Tatsuro MATSUOKA, 2018/03/27
- Re: Calling Octave from C++, Tatsuro MATSUOKA, 2018/03/27
- Re: Calling Octave from C++, Tatsuro MATSUOKA, 2018/03/27
- Re: Calling Octave from C++, Mike Miller, 2018/03/27
- Re: Calling Octave from C++, Tatsuro MATSUOKA, 2018/03/27
- Re: Calling Octave from C++,
Tatsuro MATSUOKA <=
- Re: Calling Octave from C++, andrea.delbravo, 2018/03/27
- Re: Calling Octave from C++, Tatsuro MATSUOKA, 2018/03/27
- Re: Calling Octave from C++, andrea.delbravo, 2018/03/27
Re: Calling Octave from C++, Tatsuro MATSUOKA, 2018/03/22