Fortran中的_real_预处理器有什么用途?
我试图理解用fortran编写的部分代码。该代码包含以下部分:Fortran中的_real_预处理器有什么用途?,fortran,preprocessor,real-datatype,Fortran,Preprocessor,Real Datatype,我试图理解用fortran编写的部分代码。该代码包含以下部分: REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: AR _REAL_, DIMENSION(x,y), INTENT(INOUT) :: BR 从中,我了解到\u REAL\u是一个用于精度控制的预处理器 \u REAL\u在这段代码中实际做了什么 AR值是否可以分配给BR?它们之间是否存在类型不兼容问题 我试图使用C函数将AR的值赋值给BR,extern“C”voi
REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: AR
_REAL_, DIMENSION(x,y), INTENT(INOUT) :: BR
从中,我了解到\u REAL\u
是一个用于精度控制的预处理器
\u REAL\u
在这段代码中实际做了什么AR
值是否可以分配给BR
?它们之间是否存在类型不兼容问题AR
的值赋值给BR
,extern“C”void assign(double*AR,double*BR,int*x,int*y)
但我遇到了一个问题,问题似乎是由于AR
和BR
之间的不兼容问题造成的,因为如果我将上述代码更改为:REAL(种类=8)、维度(x,y)、意图(INOUT)::AR
实数(种类=8)、尺寸(x,y)、意图(输入):BR,
问题解决了。如果我这样修改代码有什么问题吗
您引用的页面似乎是关于构建分子动力学软件包的错误报告。我从页面第二行的链接(…/gcc-bugs/…)推断出这一点,该链接指出:
!+ Specification and control of Amber's working precision
最后,从说明如何更改琥珀色构建的精度(安装软件的单精度或双精度版本)开始
如果您正在查看的书面代码是琥珀色的一部分,那么您所引用的页面确实解释了\u REAL\u
在代码中的作用。也就是说,它是一个基于工作精度的通用类型定义,在编译时用real(kind=4)
或real(kind=8)
替换。根据琥珀色的描述,默认构建是双精度的,这意味着编译时,\u REAL\u
将被REAL(kind=8)
替换。这应该回答问题1
请注意,在fortran中,AR
的值始终可以指定给BR
,但它们需要转换为适当的类型。即,如果BR
是整数数组,则需要将AR
的值转换为整数。假设您正在查看的写入代码再次针对琥珀色,并且默认的双精度未被覆盖,则BR
与AR
一样是双精度数组,因此可以在它们之间自由分配值
至于问题3,您可能需要定义一个宏,以便\u REAL
实际上意味着双精度。虽然不经常讨论,但许多fortran编译器都乐于应用预处理器。对于自动预处理(允许编译器确定标志),只需确保fortran源文件具有正确的扩展名,如第一段中概述的.F90
、.F
、.fpp
或.fpp
(请注意,英特尔编译器也理解这些扩展名)。由于我通常使用Fortran 90或更高版本编写代码,扩展名.F90
对我来说非常有用。然后,可能在源文件的标题中添加以下行:
#define _REAL_ real(kind=8)
请注意,我在最后一个下划线和实数之间添加了多个空格,以强调其中必须有空格。这样做将允许Fortran编译器用REAL(kind=8)
替换所有出现的\u REAL\u
,并为您提供一种通过修改一行而不调用编译器标志来全局修改实精度的方法
我认为这样做可能会使您的外部C引用正常工作。我不确定
\u REAL\u
是否在全球范围内可用。在您提供的链接中,它是在编译时定义的。最好避免使用该宏,并使用符合标准的东西,如ISO\u Fortran\u env
。您必须显示更多代码或生成文件。也就是说,您的\u REAL\u
来自哪里?只要阅读链接\u REAL\u
的含义就会根据您定义的工作精度而变化,这可能是由DPREC
设定的。