Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C+;调用Fortran子例程时出现错误值+; 我试图从C++调用FORTRAN子程序。作为参考,我有一个用Fortran编写的测试程序调用同一个子程序,它为程序提供了正确的值。我的Fortran知识非常有限,所以我不明白为什么我会获得垃圾值_C++_Fortran_Fortran90 - Fatal编程技术网

从C+;调用Fortran子例程时出现错误值+; 我试图从C++调用FORTRAN子程序。作为参考,我有一个用Fortran编写的测试程序调用同一个子程序,它为程序提供了正确的值。我的Fortran知识非常有限,所以我不明白为什么我会获得垃圾值

从C+;调用Fortran子例程时出现错误值+; 我试图从C++调用FORTRAN子程序。作为参考,我有一个用Fortran编写的测试程序调用同一个子程序,它为程序提供了正确的值。我的Fortran知识非常有限,所以我不明白为什么我会获得垃圾值,c++,fortran,fortran90,C++,Fortran,Fortran90,Fortran代码如下所示: program test_9j implicit none integer :: ll1, ll2, ll3, ll4, ll5, ll6, ll7, ll8, llmin, llmax, ndim, ier, i real(8) :: L1, L2, L3, L4, L5, L6, L7, L8, LMIN, LMAX real(8), allocatable, dimension(:) :: ninecof ll1 = 2 ll

Fortran代码如下所示:

program test_9j

  implicit none

  integer :: ll1, ll2, ll3, ll4, ll5, ll6, ll7, ll8, llmin, llmax, ndim, ier, i

  real(8) :: L1, L2, L3, L4, L5, L6, L7, L8, LMIN, LMAX

  real(8), allocatable, dimension(:) :: ninecof

  ll1 = 2
  ll2 = 2
  ll3 = 2
  ll4 = 2
  ll5 = 2
  ll6 = 2
  ll7 = 2
  ll8 = 2

  llmin = 0
  llmax = 6

  print*, llmin, llmax, llmax-llmin+1
  print*, ""

  L1 = real(ll1,kind=8)
  L2 = real(ll2,kind=8)
  L3 = real(ll3,kind=8)
  L4 = real(ll4,kind=8)
  L5 = real(ll5,kind=8)
  L6 = real(ll6,kind=8)
  L7 = real(ll7,kind=8)
  L8 = real(ll8,kind=8)

  LMIN = real(llmin,kind=8)
  LMAX = real(llmax,kind=8)

  ndim = llmax - llmin + 1

  ALLOCATE(ninecof(ndim),stat=ier)

!  print*, ier

  ninecof = 0.0

  print*, "main Hi1"

!  print*, "LL", LMIN, LMAX
  CALL w9j(ll1,ll2,ll3,ll4,ll5,ll6,ll7,ll8,llmin,llmax,ndim,ninecof)

!  print*, "main Hi2"

  do i=1,ndim
    print*, ninecof(i)
  end do

  print*, "main Hi3a"

  !DEALLOCATE(ninecof)

  print*, "main Hi3b"

end program test_9j
这为子程序提供了一系列正确的输出。但是,当我在C++中尝试时,它就不起作用了(注意:W9J子程序调用DRC6J子程序,这就是为什么我将它包含在外部定义中。DRC6J子程序给出正确的输出)。 对于Fortran代码:

           0           6           7

 main Hi1
  -8.5714285714285719E-003
   1.7347234759768071E-018
   1.6734693877551020E-002
   1.7347234759768071E-018
   1.3877551020408163E-002
   0.0000000000000000     
   0.0000000000000000     
 main Hi3a
 main Hi3b
这是子程序w9j代码:

subroutine w9j(l1,l2,l3,l4,l5,l6,l7,l8,lmin,lmax,ndim,cof9j)

  implicit none

  !--- in/out variables

  integer, intent(in) :: l1, l2, l3, l4, l5, l6, l7, l8, lmin, lmax, ndim
  real(8), dimension(ndim), intent(out) :: cof9j

  !--- program variables

  integer :: l1min, l1max, l2min, l2max, l3min, l3max
  integer :: i, j, k, jmin, jmax, ier, dim1, dim2, dim3

  real(8) :: y
  real(8), allocatable, dimension(:) :: sixj1, sixj2, sixj3
  real(8) :: rl1, rl2, rl3, rl4, rl5, rl6, rl7, rl8, ri
  real(8) :: rl1min, rl1max, rl2min, rl2max, rl3min, rl3max

  !--- --- ---

  print*, 'AA', l1,l2,l3,l4,l5,l6,l7,l8,lmin,lmax,ndim

  cof9j = 0.0

  do k=1,ndim
    i=k+lmin-1

!    print*, 'i', i
!    print*, ""

    if((l2+i-l1 < 0)  .or. (l2-i+l1 < 0)  .or. (-l2+i+l1 < 0)  .or. &
     & (l2+l5-l8 < 0) .or. (l2-l5+l8 < 0) .or. (-l2+l5+l8 < 0) .or. &
     & (l4+l3-l5 < 0) .or. (l4-l3+l5 < 0) .or. (-l4+l3+l5 < 0) .or. &
     & (l4+l1-l7 < 0) .or. (l4-l1+l7 < 0) .or. (-l4+l1+l7 < 0) .or. &
     & (l6+i-l3 < 0)  .or. (l6-i+l3 < 0)  .or. (-l6+i+l3 < 0)  .or. &
     & (l6+l7-l8 < 0) .or. (l6-l7+l8 < 0) .or. (-l6+l7+l8 < 0)) then
!      print*, "violation of triangularity"
      cof9j(k) = 0.0
      cycle
    end if

    l1min=max(abs(i-l8),abs(l5-l1))
    l1max=min(i+l8,l5+l1)
    dim1 = l1max -l1min + 1
!    print*, 'l1', l1min,l1max,dim1
!    print*, ""

    l2min=max(abs(l3-l7),abs(l1-l5))
    l2max=min(l3+l7,l1+l5)
    dim2 = l2max -l2min + 1
!    print*, 'l2', l2min,l2max,dim2
!    print*, ""

    l3min=max(abs(i-l8),abs(l7-l3))
    l3max=min(i+l8,l7+l3)
    dim3 = l3max -l3min + 1
!    print*, 'l3', l3min,l3max,dim3
!    print*, ""

    if (l1max < l1min .or. l2max < l2min .or. l3max < l3min) then
      cof9j(k) = 0.0
      cycle
    end if

    allocate(sixj1(dim1))
    allocate(sixj2(dim2))
    allocate(sixj3(dim3))

    sixj1 = 0.0
    sixj2 = 0.0
    sixj3 = 0.0

    ri  = real(i)  ! L1
    rl1 = real(l1) ! L2
    rl2 = real(l2) ! L3
    rl3 = real(l3) ! L4
    rl4 = real(l4) ! L5
    rl5 = real(l5) ! L6
    rl6 = real(l6) ! L7
    rl7 = real(l7) ! L8
    rl8 = real(l8) ! L9
    rl1min = 0.0
    rl1max = 0.0
    rl2min = 0.0
    rl2max = 0.0
    rl2min = 0.0
    rl3max = 0.0

!      SUBROUTINE DRC6J (L2, L3, L4, L5, L6, L1MIN, L1MAX, SIXCOF, NDIM, IER)
!          L1MAX=MIN(L2+L3,L5+L6) and L1MIN=MAX(ABS(L2-L3),ABS(L5-L6)).

!    print*, "Hi1"

!    print*, 'BB',ri,rl1,rl2,rl3,rl4,rl5,rl6,rl7,rl8,dim1,dim2,dim3

!              L2  L3  L4  L5  L6
    call DRC6J(ri,rl8,rl2,rl5,rl1,rl1min,rl1max,sixj1,dim1,ier)
!    print*, "6j - 1"
!              L2  L3  L4  L5  L6
    call DRC6J(rl3,rl7,rl4,rl1,rl5,rl2min,rl2max,sixj2,dim2,ier)
!    print*, "6j - 2"
!              L2  L3  L4  L5  L6
    call DRC6J(ri,rl8,rl6,rl7,rl3,rl3min,rl3max,sixj3,dim3,ier)
!    print*, "6j - 3"

!    print*, "Hi2"

    if (l1min /= int(rl1min) .or. l1max /= int(rl1max) .or. &
    &   l2min /= int(rl2min) .or. l2max /= int(rl2max) .or. &
    &   l3min /= int(rl3min) .or. l3max /= int(rl3max)) then
      print*, "Declared dimensions of 'sixj' arrays are wrong"
    end if

    jmin = max(l1min,l2min,l3min)
    jmax = min(l1max,l2max,l3max)
    print*, 'Jmin Jmax', jmin, jmax


    y = 0.0

    if(jmin <= jmax) then

      do j=jmin,jmax
        y = y + (2.0*j+1.0)*sixj1(j-l1min+1)*sixj2(j-l2min+1)*sixj3(j-l3min+1)
      end do

    end if

    cof9j(k) = y

    deallocate(sixj1,sixj2,sixj3)

  end do
  print*, 'end values', l1,l2,l3,l4,l5,l6,l7,l8,lmin,lmax,ndim


  return

end subroutine w9j
子程序w9j(l1、l2、l3、l4、l5、l6、l7、l8、lmin、lmax、ndim、cof9j)
隐式无
!--- 输入/输出变量
整数,意图(in)::l1、l2、l3、l4、l5、l6、l7、l8、lmin、lmax、ndim
真实(8)、尺寸(ndim)、意图(out)::cof9j
!--- 程序变量
整数::l1min,l1max,l2min,l2max,l3min,l3max
整数::i,j,k,jmin,jmax,ier,dim1,dim2,dim3
雷亚尔(8)::y
实数(8),可分配,维度(:)::sixj1,sixj2,sixj3
实数(8):rl1、rl2、rl3、rl4、rl5、rl6、rl7、rl8、ri
真实(8):rl1min,rl1max,rl2min,rl2max,rl3min,rl3max
!--- --- ---
打印*,'AA',l1,l2,l3,l4,l5,l6,l7,l8,lmin,lmax,ndim
cof9j=0.0
do k=1,ndim
i=k+lmin-1
!    打印*,'i',i
!    打印*,“”
如果((l2+i-l1<0)。或(l2-i+l1<0)。或(-l2+i+l1<0)。或&
&(l2+l5-l8<0)。或(l2-l5+l8<0)。或。(-l2+l5+l8<0)。或&
&(l4+l3-l5<0)。或(l4-l3+l5<0)。或。(-l4+l3+l5<0)。或&
&(l4+l1-l7<0)或(l4-l1+l7<0)或(-l4+l1+l7<0)。或&
&(l6+i-l3<0)。或(l6-i+l3<0)。或(-l6+i+l3<0)。或&
&(l6+l7-l8<0)或(l6-l7+l8<0)或(-l6+l7+l8<0))则
!      打印*,“违反三角形”
cof9j(k)=0.0
周期
如果结束
l1最小值=最大值(abs(i-l8)、abs(l5-l1))
l1最大值=最小值(i+l8,l5+l1)
dim1=l1max-l1min+1
!    打印*,'l1',l1min,l1max,dim1
!    打印*,“”
L2分钟=最大值(abs(l3-l7)、abs(l1-l5))
l2max=min(l3+l7,l1+l5)
dim2=l2max-l2min+1
!    打印*,'l2',l2分钟,l2最大,dim2
!    打印*,“”
l3min=最大值(防抱死制动系统(i-l8)、防抱死制动系统(l7-l3))
l3max=min(i+l8,l7+l3)
dim3=l3max-l3min+1
!    打印*,'l3',l3min,l3max,dim3
!    打印*,“”
如果(l1max如果(JMI< P>在<代码> W9J < /代码>中,你是否设置了<代码> Lmin 和 LMAX < /Cord>?在C++代码中没有设置这些变量,因此当你用C++代码打印它们时,你只需在这些变量的位置打印任何内存值,即它是未定义的。将这些变量传递到
w9j
之前,这就是为什么这似乎可行的原因

<>注意,您已经在<代码> > W9J< /COD>中标记<代码> Lmin >代码> LMAX < /C> >代码>意图(in)<代码>,但随后您尝试将它们打印在C++代码中,就好像它们是“代码> W9J < /CUL>的输出。标记为ItAuto(In)< /C> >的参数不应该在该例程中修改。

更新以下评论


<>最后的修正是注意C++调用“代码> W9J < /C> >不通过<代码> L1 < /C> >,但代码不通过任何代码,在主代码< > W9J程序中使用未定义的值。< /P> < P> > <代码> W9J < /代码>:你设置<代码> Lmin >和 LMAX < /C>RC++代码是你设置这些变量的,因此当你在C++代码中打印它们时,你只是在这些变量的位置上打印内存中的任何值,即它是未定义的。在你的原始FORTRAN代码中,在把它们传递给<代码> W9J < /代码>之前,你要设置这些变量,这就是为什么它似乎起作用。 <>注意,您已经在<代码> > W9J< /COD>中标记<代码> Lmin >代码> LMAX < /C> >代码>意图(in)<代码>,但随后您尝试将它们打印在C++代码中,就好像它们是“代码> W9J < /CUL>的输出。标记为ItAuto(In)< /C> >的参数不应该在该例程中修改。

更新以下评论


<>最后的修正是注意C++调用“代码> W9J < /C> >不通过<代码> L1<代码>,但是你通过了 L9< /Cord>,它没有被设置为任何东西,导致在主代码<> W9J例程中使用未定义的值。
           0           6           7

 main Hi1
  -8.5714285714285719E-003
   1.7347234759768071E-018
   1.6734693877551020E-002
   1.7347234759768071E-018
   1.3877551020408163E-002
   0.0000000000000000     
   0.0000000000000000     
 main Hi3a
 main Hi3b
subroutine w9j(l1,l2,l3,l4,l5,l6,l7,l8,lmin,lmax,ndim,cof9j)

  implicit none

  !--- in/out variables

  integer, intent(in) :: l1, l2, l3, l4, l5, l6, l7, l8, lmin, lmax, ndim
  real(8), dimension(ndim), intent(out) :: cof9j

  !--- program variables

  integer :: l1min, l1max, l2min, l2max, l3min, l3max
  integer :: i, j, k, jmin, jmax, ier, dim1, dim2, dim3

  real(8) :: y
  real(8), allocatable, dimension(:) :: sixj1, sixj2, sixj3
  real(8) :: rl1, rl2, rl3, rl4, rl5, rl6, rl7, rl8, ri
  real(8) :: rl1min, rl1max, rl2min, rl2max, rl3min, rl3max

  !--- --- ---

  print*, 'AA', l1,l2,l3,l4,l5,l6,l7,l8,lmin,lmax,ndim

  cof9j = 0.0

  do k=1,ndim
    i=k+lmin-1

!    print*, 'i', i
!    print*, ""

    if((l2+i-l1 < 0)  .or. (l2-i+l1 < 0)  .or. (-l2+i+l1 < 0)  .or. &
     & (l2+l5-l8 < 0) .or. (l2-l5+l8 < 0) .or. (-l2+l5+l8 < 0) .or. &
     & (l4+l3-l5 < 0) .or. (l4-l3+l5 < 0) .or. (-l4+l3+l5 < 0) .or. &
     & (l4+l1-l7 < 0) .or. (l4-l1+l7 < 0) .or. (-l4+l1+l7 < 0) .or. &
     & (l6+i-l3 < 0)  .or. (l6-i+l3 < 0)  .or. (-l6+i+l3 < 0)  .or. &
     & (l6+l7-l8 < 0) .or. (l6-l7+l8 < 0) .or. (-l6+l7+l8 < 0)) then
!      print*, "violation of triangularity"
      cof9j(k) = 0.0
      cycle
    end if

    l1min=max(abs(i-l8),abs(l5-l1))
    l1max=min(i+l8,l5+l1)
    dim1 = l1max -l1min + 1
!    print*, 'l1', l1min,l1max,dim1
!    print*, ""

    l2min=max(abs(l3-l7),abs(l1-l5))
    l2max=min(l3+l7,l1+l5)
    dim2 = l2max -l2min + 1
!    print*, 'l2', l2min,l2max,dim2
!    print*, ""

    l3min=max(abs(i-l8),abs(l7-l3))
    l3max=min(i+l8,l7+l3)
    dim3 = l3max -l3min + 1
!    print*, 'l3', l3min,l3max,dim3
!    print*, ""

    if (l1max < l1min .or. l2max < l2min .or. l3max < l3min) then
      cof9j(k) = 0.0
      cycle
    end if

    allocate(sixj1(dim1))
    allocate(sixj2(dim2))
    allocate(sixj3(dim3))

    sixj1 = 0.0
    sixj2 = 0.0
    sixj3 = 0.0

    ri  = real(i)  ! L1
    rl1 = real(l1) ! L2
    rl2 = real(l2) ! L3
    rl3 = real(l3) ! L4
    rl4 = real(l4) ! L5
    rl5 = real(l5) ! L6
    rl6 = real(l6) ! L7
    rl7 = real(l7) ! L8
    rl8 = real(l8) ! L9
    rl1min = 0.0
    rl1max = 0.0
    rl2min = 0.0
    rl2max = 0.0
    rl2min = 0.0
    rl3max = 0.0

!      SUBROUTINE DRC6J (L2, L3, L4, L5, L6, L1MIN, L1MAX, SIXCOF, NDIM, IER)
!          L1MAX=MIN(L2+L3,L5+L6) and L1MIN=MAX(ABS(L2-L3),ABS(L5-L6)).

!    print*, "Hi1"

!    print*, 'BB',ri,rl1,rl2,rl3,rl4,rl5,rl6,rl7,rl8,dim1,dim2,dim3

!              L2  L3  L4  L5  L6
    call DRC6J(ri,rl8,rl2,rl5,rl1,rl1min,rl1max,sixj1,dim1,ier)
!    print*, "6j - 1"
!              L2  L3  L4  L5  L6
    call DRC6J(rl3,rl7,rl4,rl1,rl5,rl2min,rl2max,sixj2,dim2,ier)
!    print*, "6j - 2"
!              L2  L3  L4  L5  L6
    call DRC6J(ri,rl8,rl6,rl7,rl3,rl3min,rl3max,sixj3,dim3,ier)
!    print*, "6j - 3"

!    print*, "Hi2"

    if (l1min /= int(rl1min) .or. l1max /= int(rl1max) .or. &
    &   l2min /= int(rl2min) .or. l2max /= int(rl2max) .or. &
    &   l3min /= int(rl3min) .or. l3max /= int(rl3max)) then
      print*, "Declared dimensions of 'sixj' arrays are wrong"
    end if

    jmin = max(l1min,l2min,l3min)
    jmax = min(l1max,l2max,l3max)
    print*, 'Jmin Jmax', jmin, jmax


    y = 0.0

    if(jmin <= jmax) then

      do j=jmin,jmax
        y = y + (2.0*j+1.0)*sixj1(j-l1min+1)*sixj2(j-l2min+1)*sixj3(j-l3min+1)
      end do

    end if

    cof9j(k) = y

    deallocate(sixj1,sixj2,sixj3)

  end do
  print*, 'end values', l1,l2,l3,l4,l5,l6,l7,l8,lmin,lmax,ndim


  return

end subroutine w9j