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 定义的赋值和内在赋值之间的冲突(使用nagfor)?_Fortran_Polymorphism_Gfortran_Intel Fortran_Nag Fortran - Fatal编程技术网

Fortran 定义的赋值和内在赋值之间的冲突(使用nagfor)?

Fortran 定义的赋值和内在赋值之间的冲突(使用nagfor)?,fortran,polymorphism,gfortran,intel-fortran,nag-fortran,Fortran,Polymorphism,Gfortran,Intel Fortran,Nag Fortran,内在多态赋值是某些Fortran编译器(如ifort 18、nagfor 6.2)的最新功能,在旧版本(如ifort 17、gfortran 6.3)中不可用。使用这些旧版本的一个众所周知的解决方案是使用定义的赋值,如下例所示(摘自并改编自Chivers和Sleightholme的著作): 本例编译并与ifort 15.0.3和gfortran 6.3.0配合使用。但是对于nagfor 6.2,我在编译过程中遇到了以下错误(对于行mycirc2=mycirc1): 我不清楚为什么这个编译器试图使

内在多态赋值是某些Fortran编译器(如ifort 18、nagfor 6.2)的最新功能,在旧版本(如ifort 17、gfortran 6.3)中不可用。使用这些旧版本的一个众所周知的解决方案是使用定义的赋值,如下例所示(摘自并改编自Chivers和Sleightholme的著作):

本例编译并与ifort 15.0.3和gfortran 6.3.0配合使用。但是对于nagfor 6.2,我在编译过程中遇到了以下错误(对于行
mycirc2=mycirc1
):

我不清楚为什么这个编译器试图使用指令
mycirc2=mycirc1
中定义的赋值,而这两个变量不是可分配的多态变量


当然,如果删除已定义的赋值,它将与nagfor一起工作,但与其他旧编译器不一起工作。知道这个错误是从哪里来的吗?以及如何避免它?

我相信编译器拒绝这个程序是正确的。但是,如果您与NAG签订了支持合同,我强烈建议您让他们接受我的评论作为最终意见

我将展示我的推理

很明显,对特定程序的引用
generic\u shape\u assign
类似

type(circle_t) mycirc1, mycirc2
call generic_shape_assign(mycirc2, mycirc1)
无效。它失败是因为实际参数
mycirc2
,对应于可分配多态伪参数
lhs

  • 是不可分配的
  • 与相应的伪参数的声明类型不同
  • 它不是多态的
您引用的错误消息包含因违反此秒而拒绝程序


因此,这意味着
generic\u shape\u assign
对于通用规范
assignment(=)
,不是一个有效的特定过程(对于本参考),对吗?因此,没有选择定义的赋值,编译器应该退回到内部赋值吗

这就是事情变得模糊的地方(至少对我来说)

我认为特定的子例程
generic\u shape\u assign
是为定义的赋值选择的,因此编译器拒绝您的程序是正确的,因为您没有正确调用此特定的子例程

让我们进一步看看,使用Fortran 2008 7.2.1.4,其中定义了赋值语句何时为已定义的赋值语句

为了确定子例程
generic\u shape\u assign
是否定义定义的赋值语句
mycirc2=mycirc1
,我们查看给定的点:

  • generic\u shape\u assign
    是一个具有两个伪参数的子例程(
    lhs
    rhs
  • 接口块提供了
    generic\u shape\u assign
    generic spec
    assignment(=)
  • lhs
    (类型为
    shape\u t
    )与
    mycirc2
    (动态类型为
    circle\u t
    )兼容<代码>rhs类似
  • 伪参数或实际参数没有类型参数
  • 伪参数和实际参数的秩(标量)匹配
  • 我们满足了定义赋值的所有要求:没有要求定义赋值要求所选子例程是可调用的

    总之:

    我不清楚为什么这个编译器试图使用指令
    mycirc2=mycirc1
    中定义的赋值,而这两个变量不是可分配的多态变量

    因为是否使用定义的赋值与左侧和右侧是多态的还是可分配的无关


    最后,我认为无论我的推理是正确的还是错误的,编译器的诊断信息都可以得到改进。

    “因此没有选择定义的赋值,编译器应该返回到内在赋值?”是的,我是这么认为的。我刚刚检查了最近的编译器ifort 18和gfortran 8.1(即使这里定义的赋值是多余的,因为这些编译器和nag one一样允许多态赋值),我没有收到任何错误消息,结果是正确的。是的,我会在未来几天内要求nag支持,只要我购买了这个编译器(我只使用了试用版),我会在这里报告他们的答案。谢谢francescalus。我非常有兴趣听到编译器开发人员的回答。专家们也聚集在comp.lang.fortran新闻组上。我应该补充一点,如果我是正确的,并且程序无效,那么它并不是以编译器需要检测/诊断的方式无效。抱歉,这么长时间。正如我所承诺的,我请求了Nag的支持,他们完全证实了你的分析。他们“同意可以改进编译器信息,并相信标准中的措辞将得到改进,以更好地指导编译器作者和用户。”再次感谢francescalus的帮助。感谢更新。很高兴知道这个答案没有错。
    Error: check_assign.f90, line 41: Incorrect data type CIRCLE_T (expected SHAPE_T) for argument LHS (no. 1) of GENERIC_SHAPE_ASSIGN  
    
    type(circle_t) mycirc1, mycirc2
    call generic_shape_assign(mycirc2, mycirc1)