将字符串数组从fortran传递到C/C DLL,并获取具有更改值的数组

Passing string array from Fortran to C/C++ DLL and get array with changed values

本文关键字:数组 获取 fortran 字符串 DLL      更新时间:2023-10-16

我正在创建一个接受char*[](字符串数组)的C/C DLL,更改数组中的值并返回。

我的C/C 实现:

int doubleijk_(char* data[]) // what should be the return type ???
{
   // code to change array elements
   return 0;
}

在fortran(使用ifort)中,我正在调用这样的dll函数:

module variables
  type string
    character(len=:), allocatable :: str
  end type string
end module variables

program Call_CPP
    use variables
    type(string) :: array(3) 
    array = [string('xyza'), string('abcd'), string('mnopqrs')]
    INTERFACE
! How to write SUBROUTINE for array
       SUBROUTINE doubleijk_(arr) BIND(C,NAME='doubleijk_')
!???????WHAT SHOULD BE SUBROUTINE FOR ARRAY OF STRINGS????????
       END SUBROUTINE doubleijk_
    END INTERFACE
    ! Body of Call_CPP
    call doubleijk_(array)
 ! print values of array after call
    end program Call_CPP

我能够通过fortran的整数传递字符串,并从c/c 变更。我需要的是将字符串数组从fortran传递到C/C ,并以更改的值恢复数组。我该怎么做?

最终使该工作起作用。这是解决方案。

 program Call_CPP
 use iso_c_binding, only: c_associated, c_loc, c_ptr
    INTERFACE
       SUBROUTINE doubleijk_(stringPtrs) BIND(C,NAME='doubleijk_')
        use iso_c_binding      
        TYPE(C_PTR), DIMENSION(3) :: stringPtrs
       END SUBROUTINE doubleijk_
    END INTERFACE
    TYPE(C_PTR), DIMENSION(3) :: stringPtr
    CHARACTER(LEN=20), DIMENSION(3), TARGET :: stringArray
       DO ns = 1, 3
           stringArray(ns) = "My String"//char(0)
           stringPtr(ns) = c_loc(stringArray(ns))
       END DO
    ! Body of Call_CPP
    call doubleijk_(stringPtr) !Call C function
     DO ns = 1, 3
            print *, stringArray(ns) !print array after call-changed values
     END DO
    end program Call_CPP