Fortran

From Octave
Revision as of 21:58, 12 July 2020 by Siko1056 (talk | contribs) (→‎C++ function: Use file template.)
Jump to navigation Jump to search

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

C++ function

File: octave_file_io.cc
C++ function to load a single matrix, stored in ASCII format, from a data file.

Header file

Code: octave_file_io.h: header file with C interface to octave_file_io.cc
#ifndef OCTAVE_FILE_IO_H
#define OCTAVE_FILE_IO_H

#ifdef __cplusplus
extern "C" {
#endif
  
  int octave_load (const char* filename, const char* varname, double** data, int* numel);

#ifdef __cplusplus
}
#endif

#endif


Fortran Code

Code: octave_file_io_example.f90
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



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