Sophie

Sophie

distrib > Mageia > 7 > x86_64 > by-pkgid > 641ebb3060c35990cc021d8f7aaf9aca > files > 129

octave-doc-5.1.0-7.1.mga7.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Calling External Code from Oct-Files (GNU Octave (version 5.1.0))</title>

<meta name="description" content="Calling External Code from Oct-Files (GNU Octave (version 5.1.0))">
<meta name="keywords" content="Calling External Code from Oct-Files (GNU Octave (version 5.1.0))">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Oct_002dFiles.html#Oct_002dFiles" rel="up" title="Oct-Files">
<link href="Allocating-Local-Memory-in-Oct_002dFiles.html#Allocating-Local-Memory-in-Oct_002dFiles" rel="next" title="Allocating Local Memory in Oct-Files">
<link href="Calling-Octave-Functions-from-Oct_002dFiles.html#Calling-Octave-Functions-from-Oct_002dFiles" rel="prev" title="Calling Octave Functions from Oct-Files">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smalllisp {margin-left: 3.2em}
kbd {font-style: oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nolinebreak {white-space: nowrap}
span.roman {font-family: initial; font-weight: normal}
span.sansserif {font-family: sans-serif; font-weight: normal}
ul.no-bullet {list-style: none}
-->
</style>
<link rel="stylesheet" type="text/css" href="octave.css">


</head>

<body lang="en">
<a name="Calling-External-Code-from-Oct_002dFiles"></a>
<div class="header">
<p>
Next: <a href="Allocating-Local-Memory-in-Oct_002dFiles.html#Allocating-Local-Memory-in-Oct_002dFiles" accesskey="n" rel="next">Allocating Local Memory in Oct-Files</a>, Previous: <a href="Calling-Octave-Functions-from-Oct_002dFiles.html#Calling-Octave-Functions-from-Oct_002dFiles" accesskey="p" rel="prev">Calling Octave Functions from Oct-Files</a>, Up: <a href="Oct_002dFiles.html#Oct_002dFiles" accesskey="u" rel="up">Oct-Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Calling-External-Code-from-Oct_002dFiles-1"></a>
<h4 class="subsection">A.1.9 Calling External Code from Oct-Files</h4>

<p>Linking external C code to Octave is relatively simple, as the C functions can
easily be called directly from C++.  One possible issue is that the
declarations of the external C functions may need to be explicitly defined as C
functions to the compiler.  If the declarations of the external C functions are
in the header <samp>foo.h</samp>, then the tactic to ensure that the C++ compiler
treats these declarations as C code is
</p>
<div class="example">
<pre class="example">#ifdef __cplusplus
extern &quot;C&quot;
{
#endif
#include &quot;foo.h&quot;
#ifdef __cplusplus
}  /* end extern &quot;C&quot; */
#endif
</pre></div>

<p>Calling Fortran code, however, can pose more difficulties.  This is due to
differences in the manner in which compilers treat the linking of Fortran code
with C or C++ code.  Octave supplies several macros that allow consistent
behavior across a number of compilers.
</p>
<p>The underlying Fortran code should use the <code>XSTOPX</code> function to replace
the Fortran <code>STOP</code> function.  <code>XSTOPX</code> uses the Octave exception
handler to treat failing cases in the Fortran code explicitly.  Note that
Octave supplies its own replacement <small>BLAS</small> <code>XERBLA</code> function, which
uses <code>XSTOPX</code>.
</p>
<p>If the code calls <code>XSTOPX</code>, then the <code><span class="nolinebreak">F77_XFCN</span></code><!-- /@w --> macro should be
used to call the underlying Fortran function.  The Fortran exception state can
then be checked with the global variable <code>f77_exception_encountered</code>.  If
<code>XSTOPX</code> will not be called, then the <code><span class="nolinebreak">F77_FCN</span></code><!-- /@w --> macro should be
used instead to call the Fortran code.
</p>
<p>There is no great harm in using <code><span class="nolinebreak">F77_XFCN</span></code><!-- /@w --> in all cases, except that
for Fortran code that is short running and executes a large number of times,
there is potentially an overhead in doing so.  However, if <code><span class="nolinebreak">F77_FCN</span></code><!-- /@w -->
is used with code that calls <code>XSTOP</code>, Octave can generate a segmentation
fault.
</p>
<p>An example of the inclusion of a Fortran function in an oct-file is given in
the following example, where the C++ wrapper is
</p>
<div class="example">
<pre class="verbatim">#include &lt;octave/oct.h&gt;
#include &lt;octave/f77-fcn.h&gt;

extern &quot;C&quot;
{
  F77_RET_T
  F77_FUNC (fortransub, FORTSUB)
    (const F77_INT&amp;, F77_DBLE*, F77_CHAR_ARG_DECL F77_CHAR_ARG_LEN_DECL);
}

DEFUN_DLD (fortrandemo, args, , &quot;Fortran Demo&quot;)
{
  if (args.length () != 1)
    print_usage ();

  NDArray a = args(0).array_value ();

  double *av = a.fortran_vec ();
  octave_idx_type na = a.numel ();

  OCTAVE_LOCAL_BUFFER (char, ctmp, 128);

  F77_XFCN (fortransub, FORTSUB,
            (na, av, ctmp F77_CHAR_ARG_LEN (128)));

  return ovl (a, std::string (ctmp));
}
</pre></div>

<p>and the Fortran function is
</p>
<div class="example">
<pre class="verbatim">      subroutine fortransub (n, a, s)
      implicit none
      character*(*) s
      real*8 a(*)
      integer*4 i, n, ioerr
      do i = 1, n
        if (a(i) .eq. 0d0) then
          call xstopx ('fortransub: divide by zero')
        else
          a(i) = 1d0 / a(i)
        endif
      enddo
      write (unit = s, fmt = '(a,i3,a,a)', iostat = ioerr)
     $       'There are ', n,
     $       ' values in the input vector', char(0)
      if (ioerr .ne. 0) then
        call xstopx ('fortransub: error writing string')
      endif
      return
      end
</pre></div>

<p>This example demonstrates most of the features needed to link to an external
Fortran function, including passing arrays and strings, as well as exception
handling.  Both the Fortran and C++ files need to be compiled in order for the
example to work.
</p>
<div class="example">
<pre class="example">mkoctfile fortrandemo.cc fortransub.f
[b, s] = fortrandemo (1:3)
&rArr;
  b = 1.00000   0.50000   0.33333
  s = There are   3 values in the input vector
[b, s] = fortrandemo (0:3)
error: fortrandemo: fortransub: divide by zero
</pre></div>

<hr>
<div class="header">
<p>
Next: <a href="Allocating-Local-Memory-in-Oct_002dFiles.html#Allocating-Local-Memory-in-Oct_002dFiles" accesskey="n" rel="next">Allocating Local Memory in Oct-Files</a>, Previous: <a href="Calling-Octave-Functions-from-Oct_002dFiles.html#Calling-Octave-Functions-from-Oct_002dFiles" accesskey="p" rel="prev">Calling Octave Functions from Oct-Files</a>, Up: <a href="Oct_002dFiles.html#Oct_002dFiles" accesskey="u" rel="up">Oct-Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>