Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran中的_real_预处理器有什么用途?_Fortran_Preprocessor_Real Datatype - Fatal编程技术网

Fortran中的_real_预处理器有什么用途?

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

我试图理解用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”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
    设定的。