- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
I wanted to encrypt a few files generated by my Fortran code and decided to use a c++ library for that.
As long as I stay inside my c++ part everything works fine but saving the decrypted file and then opening it in Fortran after the c++ part is done is not efficient therefore I wanted to pass the result directly.
From what I've read I need to pass the length of the string (-1 for the \0) as well as the address of it.
Passing the int part works perfectly fine but I cannot seem to pass the address nor a pointer. I tried passing the address as an int but that seems completly dirty (might be easier though)
My Fortran code is:
subroutine Encryption() use, intrinsic :: ISO_C_BINDING #include "test_api.h" type(c_ptr) :: strptr=C_NULL_ptr integer::strlen character(c_char), pointer::textptr call encrypt("smalltestfile.txt","finished.txt") call decrypt("finished.txt", strptr, strlen) call c_f_pointer(strptr, textptr, shape=[strlen-1]) write(*,*) associated(textptr)
My Fortran Interface is:
INTERFACE SUBROUTINE encrypt(UCV,RCV) BIND(C, name="encrypt") USE, INTRINSIC :: ISO_C_BINDING character(*), intent(in) :: UCV, RCV END SUBROUTINE SUBROUTINE decrypt(UCV, strptr, strlen) BIND(C, name="decrypt") USE, INTRINSIC :: ISO_C_BINDING character(*), intent(in) :: UCV type(C_PTR), value::strptr integer(c_int), intent(out):: strlen END SUBROUTINE END INTERFACE
And the minimized C++ part to just test how to return a string:
void decrypt(char **a, const char **strptr, int *strlen) { filename = *a; const char* test = "12345"; strptr = &test *strlen = 15; return; }
Now my associated tells me that the fortran pointer is (T) associated with a pointer. No idea how to properly access the values there now.
I am not used to C++ or Fortran so if I have some fundamental mistake I apologize ahead. Only programmed Python and JS before moving to this project for quite some time.
I've tried reading and understanding https://software.intel.com/en-us/node/749209 as this seems very close to what I wanted to do, but wasnt able to adapt it to my code.
Thanks in advance
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
@Fett, Sebastien:
Look into the standard features in Fortran toward interoperability with C and make use of that in your C++ code using extern "C":
Here'a quick example.
C++ function:
#include<string> #include "ISO_Fortran_binding.h" using namespace std; extern "C" { void Fstring( CFI_cdesc_t *, int * ); } void Fstring( CFI_cdesc_t *Fstr, int *ret ) { std::string s = "Hello World! The feature involving enhanced interoperability with C in the Fortran standard can be useful."; *ret = CFI_allocate(Fstr, (CFI_index_t *)0, (CFI_index_t *)0, s.length()); if ( *ret == 0 ) { std::memcpy( Fstr->base_addr, s.c_str(), s.length() ); } return; }
Fortran main program:
use, intrinsic :: iso_c_binding, only : c_char, c_int interface subroutine Fstring( str, irc ) bind(C, name="Fstring" ) ! C++ function prototype: ! extern "C" { ! void Fstring( CFI_cdesc_t *, int * ); ! } import :: c_char, c_int ! Argument list character(kind=c_char,len=:), allocatable, intent(out) :: str integer(c_int), intent(inout) :: irc end subroutine end interface ! Local variables character(kind=c_char,len=:), allocatable :: s integer(c_int) :: irc call Fstring(s, irc) print *, "C++ function Fstr returned: " print *, s end
Upon compilation and linking using a supported C++ compiler and Intel Fortran and linker tool should produce the following output upon execution of the program:
C++ function Fstr returned: Hello World! The feature involving enhanced interoperability with C in the Fort ran standard can be useful.
See some other threads you may find useful:
https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/734563
https://software.intel.com/zh-cn/node/808879
https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/815905
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page