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
Function 链接Fortran 77源代码和子程序_Function_Fortran_Gfortran_Fortran77_Linker Errors - Fatal编程技术网

Function 链接Fortran 77源代码和子程序

Function 链接Fortran 77源代码和子程序,function,fortran,gfortran,fortran77,linker-errors,Function,Fortran,Gfortran,Fortran77,Linker Errors,我正在尝试编译以下测试程序,名为test\u matrix.f: PROGRAM test_matrix IMPLICIT NONE REAL*8 A(2,2), B(2,2), Bt(2,2), C(2,2) REAL detA, detB, detC REAL getdet A(1,1) = 1 A(1,2) = 2 A(2,1) = 3 A(2,2) = 4 B(1,1) = 1 B(1,2) = 2 B(2,1) = 0 B(2,2) =

我正在尝试编译以下测试程序,名为
test\u matrix.f

PROGRAM test_matrix
  IMPLICIT NONE
  REAL*8 A(2,2), B(2,2), Bt(2,2), C(2,2)
  REAL detA, detB, detC
  REAL getdet
  A(1,1) = 1
  A(1,2) = 2
  A(2,1) = 3
  A(2,2) = 4
  B(1,1) = 1
  B(1,2) = 2
  B(2,1) = 0
  B(2,2) = 1
  detA = getdet(A,2)
  detB = getdet(B,2)
  WRITE (*,*) detA
  WRITE (*,*) detB
  END PROGRAM
其中,
getdet
是一个用于计算平方矩阵行列式的标准外部子程序,如中所述,存储在同一文件夹中的文件
getdet.f

当我试图用命令编译程序时

gfortran getdet.f test_matrix.f -o test_matrix.out
两个行列式的输出为

0.00000000
0.00000000
这显然是错误的。但是如果我在程序文件
getdet.f
中添加行,这样每次从主程序
test\u matrix.f
调用程序
getdet
时,它都会打印结果,那么我得到的就变成了

determinant is:  -2.0000000000000000
determinant is:   1.0000000000000000
0.00000000
0.00000000
这清楚地表明,无论子程序计算什么,都不会反馈到主程序
test\u matrix.f


我是否以错误的方式链接了这些程序?(一些谷歌搜索建议这是链接多个源代码文件的方法。)我应该如何解决这个问题?提前感谢您。

由于函数中的输出是
-2.0000000000000000
看起来您应该将函数声明为双精度,而不是真实的。你能测试一下吗?啊,我认为你完全正确。。。。应该在主程序中声明
REAL*8
。现在它给了我正确的答案。这是一个考虑使用接口块的好时机,这样编译器就可以检查两次并告诉你编译的时间。也可以很好地从真实*8移到一个标准一致的声明变量的方式,函数中的输出是“代码>2 0000000000000000”/代码。将函数声明为双精度,而不是实数。你能测试一下吗?啊,我认为你完全正确。。。。应该在主程序中声明
REAL*8
。现在它给了我正确的答案。这是一个考虑使用接口块的好时机,这样编译器就可以检查两次,并告诉你编译时的情况。从实际**转移到一个标准一致的声明变量的方法中也是很好的。