659
edits
(Created page with " {{Code|C++ function to load a matrix from an ASCII file in Octave native format|<syntaxhighlight lang="C" style="font-size:13px"> #include <octave_file_io.h> #include <oct...") |
Carandraug (talk | contribs) (fix name of fortran file) |
||
(7 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
This page describes an example of how to call liboctave functions from a Fortran program. | |||
In the example we will load an Octave array from a file in Octave's native ASCII format, | |||
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 Fortran code using the "iso_c_binding" intrinsic module to call the C++ function | |||
{{Code|C++ function to load a matrix from an ASCII file in Octave native format|<syntaxhighlight lang="C" style="font-size:13px"> | === C++ function === | ||
{{Code|octave_file_io.cc: C++ function to load a matrix from an ASCII file in Octave native format|<syntaxhighlight lang="C" style="font-size:13px"> | |||
#include <octave_file_io.h> | #include <octave_file_io.h> | ||
Line 41: | Line 48: | ||
*data = (double*) malloc (M.numel () * sizeof (double)); | *data = (double*) malloc (M.numel () * sizeof (double)); | ||
*numel = M.numel (); | *numel = M.numel (); | ||
memcpy (*data, M.fortran_vec (), *numel * sizeof (double)); | memcpy (*data, M.fortran_vec (), *numel * sizeof (double)); | ||
Line 49: | Line 56: | ||
{{Code|C interface to | === Header file === | ||
{{Code|octave_file_io.h: header file with C interface to octave_file_io.cc|<syntaxhighlight lang="C" style="font-size:13px"> | |||
#ifndef OCTAVE_FILE_IO_H | #ifndef OCTAVE_FILE_IO_H | ||
#define OCTAVE_FILE_IO_H | #define OCTAVE_FILE_IO_H | ||
Line 65: | Line 74: | ||
#endif | #endif | ||
</syntaxhighlight>}} | </syntaxhighlight>}} | ||
=== Fortran Code === | |||
{{Code|octave_file_io_example.f90|<syntaxhighlight lang="fortran" style="font-size:13px"> | |||
program octave_file_io_example | |||
use iso_c_binding | |||
implicit none | |||
interface | |||
function octave_load (filename, varname, data, numel) bind(c, name="octave_load") | |||
use iso_c_binding | |||
implicit none | |||
integer(c_int) :: octave_load | |||
character(kind=c_char), intent(in) :: filename(*) | |||
character(kind=c_char), intent(in) :: varname(*) | |||
type(c_ptr), intent(out) :: data | |||
integer(c_int), intent(out) :: numel | |||
end function octave_load | |||
end interface | |||
integer(c_int) :: res | |||
type(c_ptr) :: data | |||
real(c_double), pointer :: fdata(:) | |||
integer(c_int) :: numel | |||
res = octave_load (c_char_'pippo.octxt' // c_null_char, c_char_'A' // c_null_char, data, numel) | |||
call c_f_pointer (data, fdata, (/numel/)) | |||
write (*,*) fdata | |||
end program octave_file_io_example | |||
</syntaxhighlight>}} | |||
=== Compiling the code === | |||
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 | |||
[[Category:Examples]] |