2015-04-24 107 views
1

我想编译一个用FORTRAN编写的程序,该程序使用DISLIN库绘制图表,但所有数据都是双精度的。我不能失去这个精度,所以将所有内容传递给简单的精度不是一个选项。当我尝试链接到双精度库(_D),我还是收到以下错误我希望有我挂简单的精准库:DISLIN双精度库

call graf(-1.D0, 1.D0, -1.D0, 2.D0/10.D0, -1.D0, 1.D0, -1.D0, 2.D0/10.) 
     (1) 
ERROR: Type mismatch in argument 'ax' at (1); passed from REAL(8) to REAL(4). 

我也得到所有绘制报表等这样的错误。我的编译命令是(gfortran):

gfortran modulename.f95 progname.f95 C:\dislin\disgf_d.a -luser32 -lgdi32 -lopengl32 

请注意,disgf_d是指双精度库。有没有人有任何想法吗?

相关的代码:

call metafl("XWIN") 
call disini() 
call graf(-1.D0, 1.D0, -1.D0, 2.D0/10.D0, -1.D0, 1.D0, -1.D0, 2.D0/10.D0) 
do i = 0, m 
    Z(i) = -1.D0 + (2.D0*i)/m 
    Y_Z(i) = Int_g(Z(i)) 
end do 
call curve (Z, Y_Z, m + 1) 
do i = 0, m 
    Y_Z(i) = g(Z(i)) 
end do 
call curve (Z, Y_Z, m + 1) 
call endgrf() 
call disfin() 
+0

该错误告诉你,特定参数是*不*双精度。您需要研究包文档(或源代码)以确保您为每个参数使用正确的类型。 – agentp

+0

我期望'-ldislin_d'作为双精度dislin库的链接选项。 –

回答

0

我发现该解决方案与机器代码在.MOD文件中。当然,这个目标文件必须与双精度库相对应,并且在安装DISLIN之后默认的是.MOD文件引用简单精度库。在名为real64的文件夹中存在另一个dislin.MOD文件,它与双精度文件相对应,但通常不会像在另一台机器上编译的那样工作。我们必须编译真正的64文件夹进入主DISLIN目录dislin.f90文件,替换默认的mod文件,使用gfortran命令:

gfortran -c dislin.f90 

使用-c表明f.90文件夺得” t被编译成可执行文件,但被编译成目标文件。由于它是一个.f90模块,因此它将是.MOD而不是.o。

然后,使用“使用迪林”,和原始帖子中的命令一样,所有东西都可以正确编译链接到双精度库。

+0

这不是'.mod'文件的工作方式。它们依赖于编译器,但只包含模块中定义的变量的接口和描述。此外,像你所显示的一个单一的命令可以产生许多'.mod'文件,每个模块出现在源文件中。一些编译器不会创建任何'.mod'文件,但gfortran完成我写的内容。对于上面显示的命令,应该也生成'.o'文件。 –

0

尝试与线编译程序改变为

call graf(-1.E0, 1.E0, -1.E0, 2.E0/10.E0, -1.E0, 1.E0, -1.E0, 2.E0/10.) 

1.0E0和1.0D0分别是单精度和双精度常数。