<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Access Fortran Class from C++ in Software Archive</title>
    <link>https://community.intel.com/t5/Software-Archive/Access-Fortran-Class-from-C/m-p/979621#M25760</link>
    <description>&lt;P&gt;Dear all,&lt;BR /&gt;&lt;BR /&gt;I like to use from C++ a class which is coded in Fotran inside a modul. I haved tried to pass the pointer from Fortran to C++ and back again later. But this seems not to work, if calling virtual functions.&lt;BR /&gt;&lt;BR /&gt;Here is the code of the base and the dreived class: module.f&lt;BR /&gt;&lt;BR /&gt;[fortran]&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MODULE BASE_TYPE&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE :: base&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real(8) :: num&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTAINS&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; final&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: base_dtor&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure :: speak =&amp;gt; base_speak&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure :: init&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END TYPE BASE&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTAINS&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_dtor(this)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(base), intent(inout) :: this&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print *, "base_dtor"&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_speak(this)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLASS(base), intent(in) :: this&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print *, "speak: base ", this%num&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine init(this, n)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLASS(base), intent(inout) :: this&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real(8), intent(in)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: n&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this%num = n&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END MODULE BASE_TYPE&lt;/P&gt;
&lt;P&gt;!&lt;/P&gt;
&lt;P&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MODULE DERIVED_TYPE&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USE BASE_TYPE&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE, EXTENDS(BASE) :: DERIVED&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTAINS&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; final&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: derived_dtor&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure :: speak =&amp;gt; derived_speak&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END TYPE DERIVED&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTAINS&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_dtor(this)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(derived), intent(inout) :: this&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print *, "derived_dtor"&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_speak(this)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLASS(derived), intent(in) :: this&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print *, "speak: derived ", this%num&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END MODULE DERIVED_TYPE&lt;BR /&gt;[/fortran]&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;The interface for C++: interface.f&lt;BR /&gt;&lt;BR /&gt;[fortran]&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_get( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(out)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(base), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cptr=c_loc(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_free( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(base), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; deallocate(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_init( cptr, num )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real(8),&amp;nbsp;&amp;nbsp;&amp;nbsp; intent(in)&amp;nbsp;&amp;nbsp; :: num&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(base), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call fptr%init(num)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_speak( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(base), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call fptr%speak&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;&lt;BR /&gt;!&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_get( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(out)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(derived), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cptr=c_loc(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_free( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(derived), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; deallocate(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_init( cptr, num )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real(8),&amp;nbsp;&amp;nbsp;&amp;nbsp; intent(in)&amp;nbsp;&amp;nbsp; :: num&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(derived), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call fptr%init(num)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_speak( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(derived), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call fptr%speak&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;&lt;BR /&gt;[/fortran]&lt;BR /&gt;&lt;BR /&gt;The C++ test: test_interface.cpp&lt;BR /&gt;&lt;BR /&gt;[cpp]&lt;BR /&gt;&lt;BR /&gt;#include &amp;lt;cstdio&amp;gt;&lt;BR /&gt;// function for base&lt;BR /&gt;extern "C" void base_get_(void **ptr);&lt;BR /&gt;extern "C" void base_free_(void **ptr);&lt;BR /&gt;extern "C" void base_init_(void **ptr, const double *);&lt;BR /&gt;extern "C" void base_speak_(void **ptr);&lt;BR /&gt;&lt;BR /&gt;// function for derived&lt;BR /&gt;extern "C" void derived_get_(void **ptr);&lt;BR /&gt;extern "C" void derived_free_(void **ptr);&lt;BR /&gt;extern "C" void derived_init_(void **ptr, const double *);&lt;BR /&gt;extern "C" void derived_speak_(void **ptr);&lt;BR /&gt;&lt;BR /&gt;// test function&lt;BR /&gt;extern "C" void test_interface_(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; void *ptr;&lt;BR /&gt;&amp;nbsp; double num;&lt;BR /&gt;// the following lines seems to work (the output is correct)&lt;BR /&gt;&amp;nbsp; num=10.0;&lt;BR /&gt;&amp;nbsp; printf("\\nbase -&amp;gt; base %e\\n", num);&lt;BR /&gt;&amp;nbsp; base_get_(&amp;amp;ptr);&lt;BR /&gt;&amp;nbsp; base_init_(&amp;amp;ptr, &amp;amp;num);&lt;BR /&gt;&amp;nbsp; base_speak_(&amp;amp;ptr);&lt;BR /&gt;&amp;nbsp; base_free_(&amp;amp;ptr);&lt;BR /&gt;&lt;BR /&gt;// the following lines seems also to work (the output is correct)&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; num=20.0;&lt;BR /&gt;&amp;nbsp; printf("\\nderived -&amp;gt; derived %e\\n", num);&lt;BR /&gt;&amp;nbsp; derived_get_(&amp;amp;ptr);&lt;BR /&gt;&amp;nbsp; derived_init_(&amp;amp;ptr, &amp;amp;num);&lt;BR /&gt;&amp;nbsp; derived_speak_(&amp;amp;ptr);&lt;BR /&gt;&amp;nbsp; derived_free_(&amp;amp;ptr);&lt;BR /&gt;&lt;BR /&gt;//&lt;BR /&gt;&amp;nbsp; num=30.0;&lt;BR /&gt;&amp;nbsp; printf("\\nderived -&amp;gt; base %e\\n", num);&lt;BR /&gt;&amp;nbsp; derived_get_(&amp;amp;ptr);&lt;BR /&gt;&amp;nbsp; base_init_(&amp;amp;ptr, &amp;amp;num); // num is set correctly&lt;BR /&gt;&amp;nbsp; base_speak_(&amp;amp;ptr); // the base function is called&lt;BR /&gt;&amp;nbsp; base_free_(&amp;amp;ptr); // only the destructor of base is called&lt;BR /&gt;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;[/cpp]&lt;/P&gt;
&lt;P&gt;One problem might be, that I probably need to declare the pointer as CLASS(BASE), pointer ::fptr to deal with virtual functions correctly, but then I cannot convert the c_ptr pointer using the call c_f_pointer( cptr, fptr) subroutine.&lt;/P&gt;
&lt;P&gt;Do you have any ideas/workarounds or is there an official way to acces a Fotran class from C++?&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Thank you,&lt;/P&gt;
&lt;P&gt;Martin&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
    <pubDate>Mon, 11 Nov 2013 12:51:39 GMT</pubDate>
    <dc:creator>Martin_K_8</dc:creator>
    <dc:date>2013-11-11T12:51:39Z</dc:date>
    <item>
      <title>Access Fortran Class from C++</title>
      <link>https://community.intel.com/t5/Software-Archive/Access-Fortran-Class-from-C/m-p/979621#M25760</link>
      <description>&lt;P&gt;Dear all,&lt;BR /&gt;&lt;BR /&gt;I like to use from C++ a class which is coded in Fotran inside a modul. I haved tried to pass the pointer from Fortran to C++ and back again later. But this seems not to work, if calling virtual functions.&lt;BR /&gt;&lt;BR /&gt;Here is the code of the base and the dreived class: module.f&lt;BR /&gt;&lt;BR /&gt;[fortran]&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MODULE BASE_TYPE&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE :: base&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real(8) :: num&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTAINS&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; final&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: base_dtor&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure :: speak =&amp;gt; base_speak&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure :: init&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END TYPE BASE&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTAINS&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_dtor(this)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(base), intent(inout) :: this&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print *, "base_dtor"&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_speak(this)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLASS(base), intent(in) :: this&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print *, "speak: base ", this%num&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine init(this, n)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLASS(base), intent(inout) :: this&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real(8), intent(in)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: n&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this%num = n&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END MODULE BASE_TYPE&lt;/P&gt;
&lt;P&gt;!&lt;/P&gt;
&lt;P&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MODULE DERIVED_TYPE&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USE BASE_TYPE&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE, EXTENDS(BASE) :: DERIVED&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTAINS&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; final&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: derived_dtor&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure :: speak =&amp;gt; derived_speak&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END TYPE DERIVED&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTAINS&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_dtor(this)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(derived), intent(inout) :: this&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print *, "derived_dtor"&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_speak(this)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLASS(derived), intent(in) :: this&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print *, "speak: derived ", this%num&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END MODULE DERIVED_TYPE&lt;BR /&gt;[/fortran]&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;The interface for C++: interface.f&lt;BR /&gt;&lt;BR /&gt;[fortran]&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_get( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(out)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(base), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cptr=c_loc(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_free( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(base), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; deallocate(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_init( cptr, num )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real(8),&amp;nbsp;&amp;nbsp;&amp;nbsp; intent(in)&amp;nbsp;&amp;nbsp; :: num&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(base), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call fptr%init(num)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine base_speak( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(base), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call fptr%speak&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;&lt;BR /&gt;!&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_get( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(out)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(derived), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cptr=c_loc(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_free( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(derived), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; deallocate(fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_init( cptr, num )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real(8),&amp;nbsp;&amp;nbsp;&amp;nbsp; intent(in)&amp;nbsp;&amp;nbsp; :: num&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(derived), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call fptr%init(num)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;!&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine derived_speak( cptr )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use iso_c_binding&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use base_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use derived_type&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(c_ptr), intent(in)&amp;nbsp;&amp;nbsp; :: cptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(derived), pointer :: fptr&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call c_f_pointer( cptr, fptr)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call fptr%speak&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;BR /&gt;&lt;BR /&gt;[/fortran]&lt;BR /&gt;&lt;BR /&gt;The C++ test: test_interface.cpp&lt;BR /&gt;&lt;BR /&gt;[cpp]&lt;BR /&gt;&lt;BR /&gt;#include &amp;lt;cstdio&amp;gt;&lt;BR /&gt;// function for base&lt;BR /&gt;extern "C" void base_get_(void **ptr);&lt;BR /&gt;extern "C" void base_free_(void **ptr);&lt;BR /&gt;extern "C" void base_init_(void **ptr, const double *);&lt;BR /&gt;extern "C" void base_speak_(void **ptr);&lt;BR /&gt;&lt;BR /&gt;// function for derived&lt;BR /&gt;extern "C" void derived_get_(void **ptr);&lt;BR /&gt;extern "C" void derived_free_(void **ptr);&lt;BR /&gt;extern "C" void derived_init_(void **ptr, const double *);&lt;BR /&gt;extern "C" void derived_speak_(void **ptr);&lt;BR /&gt;&lt;BR /&gt;// test function&lt;BR /&gt;extern "C" void test_interface_(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; void *ptr;&lt;BR /&gt;&amp;nbsp; double num;&lt;BR /&gt;// the following lines seems to work (the output is correct)&lt;BR /&gt;&amp;nbsp; num=10.0;&lt;BR /&gt;&amp;nbsp; printf("\\nbase -&amp;gt; base %e\\n", num);&lt;BR /&gt;&amp;nbsp; base_get_(&amp;amp;ptr);&lt;BR /&gt;&amp;nbsp; base_init_(&amp;amp;ptr, &amp;amp;num);&lt;BR /&gt;&amp;nbsp; base_speak_(&amp;amp;ptr);&lt;BR /&gt;&amp;nbsp; base_free_(&amp;amp;ptr);&lt;BR /&gt;&lt;BR /&gt;// the following lines seems also to work (the output is correct)&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; num=20.0;&lt;BR /&gt;&amp;nbsp; printf("\\nderived -&amp;gt; derived %e\\n", num);&lt;BR /&gt;&amp;nbsp; derived_get_(&amp;amp;ptr);&lt;BR /&gt;&amp;nbsp; derived_init_(&amp;amp;ptr, &amp;amp;num);&lt;BR /&gt;&amp;nbsp; derived_speak_(&amp;amp;ptr);&lt;BR /&gt;&amp;nbsp; derived_free_(&amp;amp;ptr);&lt;BR /&gt;&lt;BR /&gt;//&lt;BR /&gt;&amp;nbsp; num=30.0;&lt;BR /&gt;&amp;nbsp; printf("\\nderived -&amp;gt; base %e\\n", num);&lt;BR /&gt;&amp;nbsp; derived_get_(&amp;amp;ptr);&lt;BR /&gt;&amp;nbsp; base_init_(&amp;amp;ptr, &amp;amp;num); // num is set correctly&lt;BR /&gt;&amp;nbsp; base_speak_(&amp;amp;ptr); // the base function is called&lt;BR /&gt;&amp;nbsp; base_free_(&amp;amp;ptr); // only the destructor of base is called&lt;BR /&gt;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;[/cpp]&lt;/P&gt;
&lt;P&gt;One problem might be, that I probably need to declare the pointer as CLASS(BASE), pointer ::fptr to deal with virtual functions correctly, but then I cannot convert the c_ptr pointer using the call c_f_pointer( cptr, fptr) subroutine.&lt;/P&gt;
&lt;P&gt;Do you have any ideas/workarounds or is there an official way to acces a Fotran class from C++?&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Thank you,&lt;/P&gt;
&lt;P&gt;Martin&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 11 Nov 2013 12:51:39 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Access-Fortran-Class-from-C/m-p/979621#M25760</guid>
      <dc:creator>Martin_K_8</dc:creator>
      <dc:date>2013-11-11T12:51:39Z</dc:date>
    </item>
    <item>
      <title>There are lots of experts on</title>
      <link>https://community.intel.com/t5/Software-Archive/Access-Fortran-Class-from-C/m-p/979622#M25761</link>
      <description>There are lots of experts on Intel Fortran Forum who will be answer all your questions and help. By the way, that subject is regularly discussed on Intel Fortran Forum.</description>
      <pubDate>Fri, 22 Nov 2013 14:03:58 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Access-Fortran-Class-from-C/m-p/979622#M25761</guid>
      <dc:creator>SergeyKostrov</dc:creator>
      <dc:date>2013-11-22T14:03:58Z</dc:date>
    </item>
  </channel>
</rss>

