1

当我创建一个标量整数 s 并将其传递给子例程时,它的值被转换为浮点数并且非常不准确。例如,如果我设置 s = 2 和 CALL print_my_int(s),它将把它写入()到控制台,它的值显示为 2.80259693E-45。其他标量整数的行为类似,除了 s = 0 的情况,在这种情况下,输出为 0.0000000。但即使这样仍然是错误的,因为整数显然不应该显示小数和尾数。这不是输出格式问题,因为我可以让其他整数在本地显示时正确显示。

关于这里发生了什么的任何线索?我是否需要在子例程定义中强制参数数据类型?这甚至可以做到吗?

示例代码:

PROGRAM print_int
   INTEGER  s
   s = 2
   CALL print_my_int(s)
END PROGRAM print_int

SUBROUTINE print_my_int(x)
   WRITE(*,*) x
END SUBROUTINE print_my_int

结果输出:

2.80259693E-45
4

3 回答 3

3

另一个扩展评论,比@steabert 的更简单:

PROGRAM print_int
   INTEGER  s
   s = 2
   CALL print_my_int(s)

CONTAINS

SUBROUTINE print_my_int(x)
   WRITE(*,*) x
END SUBROUTINE print_my_int

END PROGRAM print_int

通过在程序中包含子例程,您可以强制编译器生成显式接口,从而节省 3 行代码。通过在子例程中隐式保留 x 的声明,编译器会发现错误。

于 2010-12-12T22:13:19.940 回答
2

没有什么新东西,只是想通过提供一些不适合注释的代码来指出接口的使用:

如前所述,您可以implicit none在声明部分的开头放置任何地方,或者您可以在使用子例程的程序中放置一个接口,然后编译器将抛出类型不匹配错误:

PROGRAM print_int
INTERFACE
    SUBROUTINE print_my_int(x)
    END SUBROUTINE
END INTERFACE
INTEGER  s
s = 2
CALL print_my_int(s)
END PROGRAM print_int

SUBROUTINE print_my_int(x)
WRITE(*,*) x
END SUBROUTINE print_my_int
于 2010-12-12T18:25:30.430 回答
1

好的,过早的帖子,但我会把它留给遇到同样情况的人。我不习惯在 FORTRAN 中强制执行参数类型的语法。在子程序定义中,参数的数据类型在名称和参数列表的下方。如果不包括在内,GNU 编译器不会发出警告或尖叫。我想它默认将其转换为其他类型。所以,我上面的例子应该是这样的......

PROGRAM print_int
   INTEGER  s
   s = 2
   CALL print_my_int(s)
END PROGRAM print_int

SUBROUTINE print_my_int(x)
   INTEGER  x
   WRITE(*,*) x
END SUBROUTINE print_my_int
于 2010-12-12T13:33:26.733 回答