NAG Fortran编译器类型检查报错信息表述存疑咨询
Fortran编译报错相关疑问解答
问题详情
测试代码
program kinds_demo use iso_fortran_env, only: REAL64, INT32 integer(int32), parameter :: n=10 real(real64) :: A(n, n) complex(real64) :: B(n, n) real(real64) :: tr, u(n*n), v(n*n) a=1.0D0 b=1.0D0 call dcopy(n*n, a, 1, u, 1) call dcopy(n*n, b, 2, v, 1) tr=dot_product(u,v) print*,tr end program kinds_demo
编译与报错
使用NAG Fortran编译器(Release 7.1(Hanzomon) Build 7114)执行编译命令:
nagfor -c -o kinds_demo.x kinds_demo.f90
得到报错:
Error: kinds_demo.f90, line 12: Inconsistent data type
COMPLEX(KIND(0d0)) (previously DOUBLE PRECISION) for argument 2 in
reference to DCOPY
疑惑点
- NAG编译器中
REAL64=2,报错信息为何未采用COMPLEX(2)(此前为REAL(2))的形式表述类型差异? - 已有资料强调
double precision并非REAL64,为何NAG编译器将REAL64类型标注为DOUBLE PRECISION?
解答
关于类型表述形式的问题
NAG编译器在报错信息里优先采用和代码上下文关联更直观的类型描述方式:
KIND(0d0)是基于字面量推导的kind值,比直接写数字2更能让开发者快速关联到双精度类型的实际含义;- 对于
COMPLEX类型,用COMPLEX(KIND(0d0))表述,既明确了kind属性,又避免了直接写数字可能带来的歧义——不同编译器对kind值的定义可能有差异,虽然NAG里REAL64=2,但其他编译器不一定遵循这个设定。
关于REAL64与DOUBLE PRECISION的标注问题
在NAG编译器的实现中,REAL64对应的kind值恰好和传统DOUBLE PRECISION类型的kind值完全一致(都是2)。编译器在这里用DOUBLE PRECISION作为REAL64的等效描述,是为了兼容开发者对传统Fortran类型的认知——毕竟DOUBLE PRECISION是Fortran标准里长期存在的类型声明方式,而REAL64是Fortran 2003才引入的标准化kind常量。
需要明确的是:标准层面REAL64是标准化的双精度实数kind常量,DOUBLE PRECISION是类型说明符,二者并非完全等同,但在NAG的具体实现中,它们指向了同一个kind值,所以编译器会在报错里用更易理解的DOUBLE PRECISION来辅助说明。
内容的提问来源于stack exchange,提问作者yarchik
相关产品推荐
相关产品推荐

