【问题标题】:DISLIN double-precision librariesDISLIN 双精度库
【发布时间】:2015-04-24 17:47:12
【问题描述】:

我正在尝试编译一个用 FORTRAN 编写的程序,该程序使用 DISLIN 库绘制图形,但所有数据都是双精度的。我不能失去这种精度,因此不能将所有内容都传递给简单的精度。当我尝试链接到双精度库 (_d) 时,如果链接到简单精度库,我仍然会收到以下错误:

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()

【问题讨论】:

  • 该错误告诉您特定参数是 not 双精度。您需要研究包文档(或源代码)以确保为每个参数使用正确的类型。
  • 我希望 -ldislin_d 作为双精度 dislin 库的链接选项。

标签: plot fortran gfortran double-precision


【解决方案1】:

尝试编译程序,将行改为

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 分别是单精度和双精度常量。

【讨论】:

    【解决方案2】:

    我发现解决方案在带有机器代码的 .MOD 文件中。自然,这个目标文件必须与双精度库对应,安装DISLIN后默认为.MOD文件引用单精度库。在名为 real64 的文件夹中存在另一个与双精度文件对应的 dislin.MOD 文件,但是这通常不起作用,因为它是在另一台机器上编译的。必须将 real 64 文件夹中的 dislin.f90 文件编译到主 dislin 目录中,替换默认的 .MOD 文件,使用 gfortran 命令:

    gfortran -c dislin.f90
    

    -c 表示 f.90 文件不会编译成可执行文件,而是编译成目标文件。因为它是一个 .f90 模块,所以这将是 .MOD 而不是 .o。

    然后,使用“use dislin”以及与原帖中相同的命令,所有内容都可以正确编译并链接到双精度库。

    【讨论】:

    • .mod 文件不是这样工作的。它们依赖于编译器,但或多或​​少只包含模块中定义的接口和变量描述。此外,如您所展示的单个命令可以生成许多 .mod 文件,一个用于源文件中存在的每个模块。一些编译器不会创建任何 .mod 文件,但 gfortran 会执行我编写的操作。对于上面显示的命令,.o 文件也应该已经生成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    相关资源
    最近更新 更多