Mar*_* Jr 2 fortran introspection
我对 Fortran 有点陌生,是从 Python、R 和 SAS 开始接触它的。在所有这些语言中,数据类型格式化都嵌入在输出函数中,但 Fortran 需要(除其他外)为每个写入的变量提供显式格式指示符。我想通过利用变量自省来动态构建格式字符串,让 fortran 告诉我数据类型是什么,以及适用的属性(KIND、LEN 等)。这种反思也将有助于构建普遍适用的程序子单元。
在 Python 和 R 的 OO 世界中,这是一个微不足道的查询。例如,在 Python 中测试一个值是否是字符串只是......
isinstance('foo',basestring)
Run Code Online (Sandbox Code Playgroud)
当然还有其他方法。无论如何,我无法动摇这种内在的探究必须存在于 Fortran 中的想法。迄今为止,我所看到的都是无法区分整个实数值和整数的方法。
其他人建议IOSTAT
在READ
声明中使用该参数。我还没有弄清楚如何利用这个语句来处理内存中已经存在的变量。(目前,我只遇到过将该READ
语句与从键盘或硬盘上的文件读取结合使用。)
有人请告诉我我在某个地方犯了严重的疏忽。我觉得这个能力必须存在。谢谢。
这种能力不存在。您始终知道您正在使用的变量是什么类型。至少是声明的类型。对于多态类型,您必须使用多态select type
类型来获取实际类型,但您在编译时又知道了类型。
您可以使用gw.d
或g0
描述符对内在类型进行通用格式化。你不需要考虑它属于什么类型的数字。对于用户定义的派生类型,可以定义自己的 I/O 例程。
对于非常简单的 I/O,您可以使用列表导向的 I/O,例如,
print *, x
read(*,*) x
write(*,*) x
Run Code Online (Sandbox Code Playgroud)
何时可以使用它有一些限制,并且您对其行为没有太多控制权。
否则,我认为这种能力显然不是 OO 语言中必须具备的。您所说的两种语言(R、Python)都是动态类型的,因此对此有更大的需求。在C++98中有,typeid()
但大多数人不需要它。