当我创建一个标量INTEGER,并将其传递给子程序时,它的值将被转换为浮点数并且非常不准确。例如,如果我将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
答案 0 :(得分: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的声明,编译器会发现错误。
答案 1 :(得分: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
答案 2 :(得分: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