"character*10 :: a" 和 "character :: a(10)" 之间的区别
Difference between "character*10 :: a" and "character :: a(10)"
为了更新我对项目的 Fortran 90 知识,我在使用内部文件时 运行 遇到了一些奇怪的事情。考虑示例代码:
! ---- internal_file_confusion.f90 ----
program internal_file_confusion
implicit none
character*40 :: string1
character :: string2(40)
write(string1, *) "Hello World 1"
write(*,*) "string1 = ", string1
write(string2, *) "Hello World 2"
write(*,*) "string2 = ", string2
end program
使用 gfortran
编译时崩溃,写入 STDOUT
string1 = Hello World 1
At line 10 of file e:/Daten/tmp/fortran-training/internal_file_confusion.f90
Fortran runtime error: End of record
当用*length
符号声明时,字符数组可以用于内部写入,但当用name(length)
符号声明时则不能。此外,我注意到 *length
符号似乎只允许用于字符数组,而像
这样的错误消息是禁止的
Error: Old-style type declaration INTEGER*40 not supported at (1)
其他数据类型。
这些符号之间有什么区别,为什么会影响作为内部文件的使用?
character*40 :: string
是长度为40
的字符串
character :: string*40
同
character(len=40) :: string
也是一个长度为40
的字符串
character :: string(40)
是一个长度为1
的40个字符串的数组
character*40 :: string(40)
是一个长度为40
的40个字符串的数组
character :: string(40)*40
同
character(len=40) :: string(40)
是一个长度为40
的40个字符串的数组
您的第二次内部写入失败,因为它写入数组 string2
中的第一个字符串。第一个字符串 string2(1)
只有一个字符长而且太短了。出于这个原因,您会遇到 记录结束 错误情况,消息对于提供的字符串来说太长了。
内部写入将数组元素视为单独的记录(类似于单独的行)。如果有更多记录(行)要写入数组,则可以在内部写入中使用字符串数组。
为了更新我对项目的 Fortran 90 知识,我在使用内部文件时 运行 遇到了一些奇怪的事情。考虑示例代码:
! ---- internal_file_confusion.f90 ----
program internal_file_confusion
implicit none
character*40 :: string1
character :: string2(40)
write(string1, *) "Hello World 1"
write(*,*) "string1 = ", string1
write(string2, *) "Hello World 2"
write(*,*) "string2 = ", string2
end program
使用 gfortran
编译时崩溃,写入 STDOUT
string1 = Hello World 1
At line 10 of file e:/Daten/tmp/fortran-training/internal_file_confusion.f90
Fortran runtime error: End of record
当用*length
符号声明时,字符数组可以用于内部写入,但当用name(length)
符号声明时则不能。此外,我注意到 *length
符号似乎只允许用于字符数组,而像
Error: Old-style type declaration INTEGER*40 not supported at (1)
其他数据类型。
这些符号之间有什么区别,为什么会影响作为内部文件的使用?
character*40 :: string
是长度为40
character :: string*40
同
character(len=40) :: string
也是一个长度为40
character :: string(40)
是一个长度为1
character*40 :: string(40)
是一个长度为40
character :: string(40)*40
同
character(len=40) :: string(40)
是一个长度为40
您的第二次内部写入失败,因为它写入数组 string2
中的第一个字符串。第一个字符串 string2(1)
只有一个字符长而且太短了。出于这个原因,您会遇到 记录结束 错误情况,消息对于提供的字符串来说太长了。
内部写入将数组元素视为单独的记录(类似于单独的行)。如果有更多记录(行)要写入数组,则可以在内部写入中使用字符串数组。