Latest revision |
Your text |
Line 1: |
Line 1: |
| This page describes an example of how to call liboctave functions from a Fortran program. | | This page describes an example of how to call liboctave functions from a Fortran program. |
| In the example we will load a single matrix, stored in ASCII format, from a data file. | | In the example we will load an Octave array from a file in Octave's native ASCII format, |
| It consists of two steps:
| | it consists of two steps: |
|
| |
|
| # write a C++ function with a C compatible interface and C linkage that reads a variable from an Octave ASCII file
| | * write a C++ function with a C compatible interface and C linkage that reads a variable from an Octave ASCII file |
| # write Fortran code using the "iso_c_binding" intrinsic module to call the C++ function
| | * write Fortran code using the "iso_c_binding" intrinsic module to call the C++ function |
| | |
| === Data file ===
| |
| | |
| {{File|data.txt|<syntaxhighlight lang="text">
| |
| 1.59797350e-01 5.41307474e-01 1.12127655e-01 2.09249248e-01
| |
| 3.22564589e-01 7.94307947e-01 8.25924316e-01 5.38352076e-01
| |
| 3.63990736e-01 1.90371212e-02 2.89370865e-01 1.30131246e-01
| |
| 6.28360462e-01 1.98831330e-01 6.89539723e-01 6.91062597e-01
| |
| </syntaxhighlight>}}
| |
| | |
| The file was generated with
| |
| | |
| <syntaxhighlight lang="octave">
| |
| A = rand (4);
| |
| save -ascii data.txt A
| |
| </syntaxhighlight>
| |
|
| |
|
| === C++ function === | | === C++ function === |
Line 79: |
Line 63: |
| #endif | | #endif |
| | | |
| int octave_load (const char* filename, double** data, int* numel); | | int octave_load (const char* filename, const char* varname, double** data, int* numel); |
|
| |
|
| #ifdef __cplusplus | | #ifdef __cplusplus |
Line 131: |
Line 115: |
| === Compiling the code === | | === Compiling the code === |
|
| |
|
| Generate {{Path|octave_file_io.o}} from {{Path|octave_file_io.cc}}.
| | mkoctfile -I. octave_file_io.cc |
| | | mkoctfile -I. --mkoctfile --link-stand-alone octave_file_io_example.f90 octave_file_io.o -o octave_file_io_example |
| mkoctfile -I. -c octave_file_io.cc
| |
| | |
| Generate {{Path|octave_file_io_example.exe}} from {{Path|octave_file_io_example.f90}} including {{Path|octave_file_io.o}}.
| |
| | |
| mkoctfile -I. --link-stand-alone octave_file_io_example.f90 octave_file_io.o -o octave_file_io_example.exe -lgfortran
| |
| | |
| If you receive errors about missing libraries, make sure your <code>LD_LIBRARY_PATH</code> is set correctly to find all Octave libraries, e.g.
| |
| | |
| $ ldd ./octave_file_io_example.exe
| |
| ...
| |
| libgfortran.so.4 => /usr/lib64/libgfortran.so.4 (0x00007fe9eb62b000)
| |
| liboctinterp.so.8 => not found
| |
| liboctave.so.8 => not found
| |
| ...
| |
| | |
| Then find {{Path|liboctinterp.so.8}} and {{Path|liboctave.so.8}} on your system and type
| |
| | |
| export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib/octave/{{Release}}/
| |
| | |
|
| |
|
| [[Category:Examples]] | | [[Category:Examples]] |