“character*10 :: a"之间的区别和“字符 :: a(10)" [英] Difference between "character*10 :: a" and "character :: a(10)"
问题描述
为了更新我的 Fortran 90 知识,我在使用内部文件时遇到了一些奇怪的问题.考虑示例代码:
Trying to refresh my Fortran 90 knowledge for a project, I have run into some oddity when using internal files. Consider the example code:
! ---- 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
which when compiled with gfortran
crashes, writing to 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
表示法似乎只允许用于字符数组,而禁止使用类似
When declared with the *length
notation the character array can be used for internal write, but not when declared with the name(length)
notation. Furthermore I noticed that the *length
notation seems to be allowed only for character arrays, while it is forbidden with an error message like
Error: Old-style type declaration INTEGER*40 not supported at (1)
对于其他数据类型.
这些符号有什么区别,为什么会影响作为内部文件的使用?
What is the difference between these notations and why does it affect use as internal files?
推荐答案
character*40 :: string
是长度为40的字符串
字符::string*40
是一样的
character(len=40) :: string
也是长度为40的字符串
character(len=40) :: string
is also a character string of length 40
character :: string(40)
是一个由 40 个长度为 1 的字符串组成的数组
character :: string(40)
is an array of 40 character strings of length 1
character*40 :: string(40)
是40个长度为40的字符串数组
character*40 :: string(40)
is an array of 40 character strings of length 40
字符::string(40)*40
是一样的
character(len=40) :: string(40)
是一个由 40 个长度为 40 的字符串组成的数组
character(len=40) :: string(40)
is an array of 40 character strings of length 40
您的第二次内部写入失败,因为它写入数组 string2
中的第一个字符串.第一个字符串 string2(1)
只有 1 个字符长,太短了.由于这个原因,您会收到 记录结束 错误条件,即消息对于提供的字符串来说太长了.
Your second internal writes fails, because it writes to the first string in the array string2
. The first string string2(1)
is just 1 character long and that is too short. For that reason you get the end of record error condition, the message is too long for the supplied string.
内部写入将数组元素视为单独的记录(类似于单独的行).如果有更多记录(行)要写入数组,则可以在内部写入中使用字符串数组.
Internal writes treat array elements as separate records (similar to separate lines). One can utilize arrays of string in internal writes if one has more records (lines) to write into the array.
这篇关于“character*10 :: a"之间的区别和“字符 :: a(10)"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!