Fortran Coder

查看: 16969|回复: 5
打印 上一主题 下一主题

[求助] 编译链接问题

[复制链接]

11

帖子

3

主题

0

精华

入门

F 币
50 元
贡献
30 点
跳转到指定楼层
楼主
发表于 2017-11-1 08:14:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
        !MAIN PROGRAM
        PROGRAM HOMEWORK0
        complex*8 a,b
        a=cdsqrt((-4.d0,0.d0))        
        write(*,*)a
        b = cdabs(a)
        write(*,*)b
                stop
        END PROGRAM HOMEWORK0 

此程序编译有警告“D:\hw1.f(9) : Warning: This argument's data type is incompatible with this intrinsic procedure; procedure assumed EXTERNAL.   [A]”
链接出错“hw1.obj : error LNK2001: unresolved external symbol _CDABS@4”
*********************************************************************
而换这样写就没问题
[Fortran] 纯文本查看 复制代码
      !MAIN PROGRAM
        PROGRAM HOMEWORK0
         complex*8 a,b
        a=cdabs(cdsqrt((-4.d0,0.d0)))
        write(*,*)a        
                stop
        END PROGRAM HOMEWORK0


********************************************************************
请问这是什么问题?能介绍一下fortran是如何编译链接的。

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2017-11-1 08:50:07 | 只看该作者
本帖最后由 vvt 于 2017-11-1 08:51 编辑

第一个问题
complex*8 a , b
等效于
complex(4) a , b
在大多数编译器上,等效于 complex a , b ,是单精度的。

您要使用双精度,请用
complex(8) a , b
或 complex(kind=8) a , b !推荐这种
或 complex*16 a , b !不推荐这种

第二个问题
b = cdabs(a)  要求 a 是双精度的,而因为你的第一个问题,导致 a 是单精度,所以会出错。

第三个问题
其实没必要写 cdabs ,直接写
[Fortran] 纯文本查看 复制代码
PROGRAM HOMEWORK0
  Implicit None
  complex(kind=8) :: a , b
  a=sqrt((-4.d0,0.d0))
  write(*,*)a
  b = abs(a)
  write(*,*)b
END PROGRAM HOMEWORK0

就可以了,编译器会根据你的参数类型,自动决定用单精度还是双精度,real还是complex
详解 http://whyd.w.fcode.cn


最后一个问题fortran是如何编译链接的。
如果您是想知道如何操作编译器,令其编译链接。那么不同编译器的操作方式不一样。
如果您是想了解编译器内部是如何实现编译链接的。您可以看《编译原理》,还有 gfortran 的源代码。



祝好!

11

帖子

3

主题

0

精华

入门

F 币
50 元
贡献
30 点
板凳
 楼主| 发表于 2017-11-1 10:27:17 | 只看该作者
vvt 发表于 2017-11-1 08:50
第一个问题
complex*8 a , b
等效于

谢谢!理解。
这里的代码对编译器版本(或者fortran版本)有要求吧

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
地板
发表于 2017-11-1 11:21:53 | 只看该作者
本帖最后由 vvt 于 2017-11-1 11:26 编辑

支持90的编译器就可以





490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

5#
发表于 2017-11-1 11:22:13 | 只看该作者
首先,上周lz的帖子就有热心版友li913给出本站的函数重载说明
http://fcode.cn/guide-61-1.html
其次,翻翻gfortran的在线手册,譬如sqrt函数
https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gfortran/SQRT.html#SQRT

11

帖子

3

主题

0

精华

入门

F 币
50 元
贡献
30 点
6#
 楼主| 发表于 2017-11-1 15:30:42 | 只看该作者
谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-26 21:25

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表