我试图将数组从C/C++传递到Fortran 2003模块,并将计算值返回到C/C++.我已经能够传递并返回单个值(标量),但是来回获取数组很难.我在标量值上发现了很多线程,并且我已经成功地完成了这些工作.
在我的工作标量函数之后,我已经模拟了基于数组的函数.
我正在使用gcc/gfortran.
这是Fortran模块(ConvertUnitsLib.f03).
module ConvertUnitsLib
use :: iso_c_binding ! for C/C++ interop
real(c_double), bind(c) :: degF, degC
public DegCtoF
contains
!
! Convert temperature degrees Celsius Fahrenheit
!
real(kind = c_double) function DegCtoF(degC) result(degF) &
& bind(c, name = "DegCtoF")
real(c_double), intent(in), dimension(:) :: degC
real(c_double), dimension(size(degC)) :: degF
do i = 1, size(degC)
degF(i) = ( degC(i) * 1.8 ) + 32
end do
end function DegCtoF
! End of module
end module ConvertUnitsLib
Run Code Online (Sandbox Code Playgroud)
和C/C++,(CFort.cpp) …
我想计算Fortran 90中两个向量的叉积.例如,在单词中,(1,2,3)和(4,5,6)的叉积结果为(-3,6, -3)在笛卡尔坐标系中.我编写了以下代码(主程序后跟函数定义):
PROGRAM crosstest
IMPLICIT NONE
INTEGER, DIMENSION(3) :: m, n
INTEGER, DIMENSION(3) :: cross
INTEGER, DIMENSION(3) :: r
m=(/1, 2, 3/)
n=(/4, 5, 6/)
r=cross(m,n)
END PROGRAM crosstest
FUNCTION cross(a, b)
INTEGER, DIMENSION(3) :: cross
INTEGER, DIMENSION(3), INTENT(IN) :: a, b
cross(1) = a(2) * b(3) - a(3) * b(2)
cross(2) = a(3) * b(1) - a(1) * b(3)
cross(3) = a(1) * b(2) - a(2) * b(1)
END FUNCTION cross
Run Code Online (Sandbox Code Playgroud)
但是,我收到一条错误消息:
crosstest.f90:10.9:
r=cross(m,n)
1
Error: Rank mismatch …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
Program function_as_an_array
implicit none
integer:: i
integer, parameter:: N=10
real*8:: x(N),y(N),f(N)
do i=1,N
x(i)=float(i)
end do
call func(f,N,x)
open(unit=20, file='test.dat')
do i=1,N
y(i)=f(i)
write(20,*) x(i),y(i)
end do
close(20)
Stop
End Program function_as_an_array
Subroutine func(f,N,x)
implicit none
integer i,N
real*8:: x(N),f(N)
do i=1,N
f(i)=x(i)**2
end do
end Subroutine func
Run Code Online (Sandbox Code Playgroud)
我想让程序确实用于"作为arrray的功能",即我想替换Subroutine funcby function f和得到相同的结果(在主程序中,我希望保持一个声明y=f(x,N)).我怎样才能做到这一点?
谢谢.
作为Fortran 90自由格式的新手,我真的很想知道为什么下面的代码片段不起作用:
program test2
implicit none
!!! A program to practice f90 writing.
! Define double precision data
integer, parameter :: dp = kind(1.d0)
real(dp) :: a(3), b(3)
integer :: i
a = (/(i, i=1, 3)/)
b = (/(i, i=1, 3)/)
write (*, *) m31tensorprod(a, b)
contains
function m31tensorprod(a, b)
real(dp), dimension(3), intent(in) :: a, b
real(dp), intent(out) :: m31tensorprod(3, 3)
integer :: k1, k2
forall(k1=1:3, k2=1:3)
m31tensorprod(k1, k2) = a(k1) * b(k2)
end forall
return
end function m31tensorprod
end …Run Code Online (Sandbox Code Playgroud)