! Copyright 2020 Free Software Foundation, Inc. ! ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2 of the License, or ! (at your option) any later version. ! ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program. If not, see . module type_module use, intrinsic :: iso_c_binding, only: c_int, c_float, c_double type, bind(C) :: MyType real(c_float) :: a real(c_float) :: b end type MyType end module type_module program mixed_stack_main implicit none ! Set up some locals. ! Call a Fortran function. call mixed_func_1a write(*,*) "All done" end program mixed_stack_main subroutine breakpt () implicit none write(*,*) "Hello World" ! Break here. end subroutine breakpt subroutine mixed_func_1a() use type_module implicit none TYPE(MyType) :: obj complex(kind=4) :: d obj%a = 1.5 obj%b = 2.5 d = cmplx (4.0, 5.0) ! Call a C function. call mixed_func_1b (1, 2.0, 3D0, d, "abcdef", obj) end subroutine mixed_func_1a ! This subroutine is called from the Fortran code. subroutine mixed_func_1b(a, b, c, d, e, g) use type_module implicit none integer :: a real(kind=4) :: b real(kind=8) :: c complex(kind=4) :: d character(len=*) :: e character(len=:), allocatable :: f TYPE(MyType) :: g interface subroutine mixed_func_1c (a, b, c, d, f, g) bind(C) use, intrinsic :: iso_c_binding, only: c_int, c_float, c_double use, intrinsic :: iso_c_binding, only: c_float_complex, c_char use type_module implicit none integer(c_int), value, intent(in) :: a real(c_float), value, intent(in) :: b real(c_double), value, intent(in) :: c complex(c_float_complex), value, intent(in) :: d character(c_char), intent(in) :: f(*) TYPE(MyType) :: g end subroutine mixed_func_1c end interface ! Create a copy of the string with a NULL terminator on the end. f = e//char(0) ! Call a C function. call mixed_func_1c (a, b, c, d, f, g) end subroutine mixed_func_1b ! This subroutine is called from the C code. subroutine mixed_func_1d(a, b, c, d, str) use, intrinsic :: iso_c_binding, only: c_int, c_float, c_double use, intrinsic :: iso_c_binding, only: c_float_complex implicit none integer(c_int) :: a real(c_float) :: b real(c_double) :: c complex(c_float_complex) :: d character(len=*) :: str interface subroutine mixed_func_1e () bind(C) implicit none end subroutine mixed_func_1e end interface write(*,*) a, b, c, d, str ! Call a C++ function (via an extern "C" wrapper). call mixed_func_1e end subroutine mixed_func_1d ! This is called from C++ code. subroutine mixed_func_1h () call breakpt end subroutine mixed_func_1h