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格式说明符_Fortran_Gfortran - Fatal编程技术网

将字符串长度插入fortran格式说明符

将字符串长度插入fortran格式说明符,fortran,gfortran,Fortran,Gfortran,我正在尝试使用gfortran 4.4.6编译其他人的FORTRAN代码。最初的编码器使用类似Compaq FORTRAN的东西 所讨论的代码应该读取类似“foo.txt”的文件名,并创建一个名为“foo_c.txt”的新文件: file_label_end = SCAN(filename, '.') - 1 WRITE (output_filename,5) filename 5 FORMAT (A<file_label_end>, '_c.txt' ) 但我后来也

我正在尝试使用gfortran 4.4.6编译其他人的FORTRAN代码。最初的编码器使用类似Compaq FORTRAN的东西

所讨论的代码应该读取类似“foo.txt”的文件名,并创建一个名为“foo_c.txt”的新文件:

file_label_end = SCAN(filename, '.') - 1 WRITE (output_filename,5) filename 5 FORMAT (A<file_label_end>, '_c.txt' ) 但我后来也遇到了类似的情况:

12 FORMAT (<n-1>F10.5) ... READ(1,12) (cat_parm (blk,j), j = 1,n-1) 12格式(F10.5) ... 读取(1,12)(类别参数(blk,j),j=1,n-1) 我试图通过创建一个格式字符串来修复它:

write(fmt12,'(I0,A4)') n-1, 'F10.5' !12 FORMAT (fmt12) 12 FORMAT (fmt=fmt12) 写入(fmt12,,(I0,A4)’n-1,'F10.5' !12格式(fmt12) 12格式(fmt=fmt12)
但是“fmt”中的“t”被标记为“格式字符串中需要非负宽度”的错误。

最简单的方法是使用现代fortran

WRITE (output_filename,'(a)') trim(filename) // '_c.txt'
否则,我将使用类似的内部写入操作将数字写入格式字符串。

在Fortran编辑描述符中使用
是非标准的,尽管已广泛实现。当然,您可以从变量构建编辑描述符,标准方法是通过内部写入,类似这样(省略声明):

然后

write(output_filename,fmt=format_string) filename
但在你的情况下,这并不是完全必要的。你可以试试这个

file_label_end = SCAN(filename, '.') - 1
WRITE (output_filename,'(a)') filename(1:file_label_end)//'_c.txt'
使用“a”编辑描述符省略宽度意味着表达式中的所有字符都将被写入。您可能需要申报

character(len=*), allocatable :: output_filename

如果您还没有这样做。

非常有帮助。此外,SCAN的BACK选项也很有用。但是我试着把这个应用到程序中的另一个实例中。我创建了一个保存格式的字符串变量;当我使用它(“12格式(fmt12)”或“12格式(fmt=fmt12)”时,编译器会用“格式字符串中需要的非负宽度”来标记该行(它实际上会标记fmt中的“t”[在这两种情况下])。
file_label_end = SCAN(filename, '.') - 1
WRITE (output_filename,'(a)') filename(1:file_label_end)//'_c.txt'
character(len=*), allocatable :: output_filename