Fortran中无参数FMT的作用是什么?字符数组作FMT时WRITE如何读取格式
字符数组作为Fortran 77格式说明符的运行规则
Fortran 77 标准原生支持把字符型数组作为READ/WRITE语句的格式参数传入,编译器的处理逻辑非常明确:
- 按数组元素在内存中的排列顺序,从第一个元素的第一个字符开始,把所有元素的定长内容首尾拼接成连续的字符序列
- 解析格式时会自动跳过所有不在字符常量范围内的多余空格——定长字符类型赋值时自动补的尾部空格全在忽略范围内,完全不影响格式解析结果
- 从序列头开始解析,遇到第一个不属于格式内部嵌套结构的右括号
)时,直接判定格式串结束,数组剩余位置存储的内容不会被读取。
你看到的CHARACTER*4 FMT(4)是每个元素长度为4的定长字符数组,赋值长度不足4的字符串时,会自动在元素尾部补空格。结合你给出的初值片段和...etc...的省略标记,这是老旧Fortran 77程序非常典型的动态格式构造方案:把完整格式串拆成多个片段存在不同数组元素里,需要调整格式时直接修改对应位置的元素即可,不需要做复杂的字符串拼接。
对应你给的代码场景:如果把省略的元素补全,FMT存储的片段依次为'('、'9,'、'1X'、'A'、'0'、')',拼接后实际生效的格式等价于(9,1X,A0);当执行FMT(4) = '3x'后,对应位置的片段被替换,拼接后的格式就变为(9,1X,A3X),输出行为会同步变化。
这种写法在Fortran 77年代普及率极高:早期大量编译器不支持内部文件(即通过WRITE语句向字符变量写内容实现字符串拼接),用数组存储格式片段、修改单个元素就能调整格式重复数、字段宽度、走纸控制符,比手动拼接字符串效率高,也不容易出格式拼接错误。
关于“无参数FMT”的说明
你代码里的FMT不是Fortran语法规定的特殊关键字,只是程序员自定义的字符数组变量名,不存在所谓“无参数FMT”的特殊语法。Fortran的WRITE语句中,控制参数括号内逗号后的位置是格式说明位,仅支持三类合法输入:
- 代码中FORMAT语句对应的行号,是固定格式Fortran最早期的写法
- 星号
*,即表控格式,由编译器根据输出变量的类型自动匹配输出宽度和排版规则 - 字符型常量、变量、数组或合法的字符表达式,内容必须符合Fortran格式说明的语法规则,也就是你当前代码使用的形式。
内容的提问来源于stack exchange,提问作者user3184199
相关产品推荐
相关产品推荐

