方式Fortran处理空白区域

时间:2013-07-12 08:33:25

标签: fortran fortran90

我想对Fortran处理字符串中的“空”字符的方式做一些澄清。 让我们假设我们遇到这种情况:

program main
implicit none

test('AB')
end program

,其中

function test(name)
implicit none
character(10) :: name
character(3)  :: cutname

write(*,*) '-'//name//'-'             ! Gives output "-AB        -" 
                                      ! Space has then been added at the end
cutname(1:3) = name(1:3)
write(*,*) '1-'//cutname//'-'           ! Gives output "-AB -"
                                        ! It seems there is a space then at the end
                                        ! of cutname

write(*,*)  (cutname(1:2) == 'AB')      ! Gives output  T (true)
write(*,*)  (cutname(3:3) == ' ')       ! Gives output  F (false)
write(*,*)  (cutname  == 'AB ')         ! Gives output  F (false)

end function

我很好奇在这种情况下发生了什么。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

Fortran中的标准字符串是固定长度。如果你不使用整个字符串,它们会在末尾用空格/空格填充。

我修改了你的示例程序来传递gfortran和ifort的编译器检查。你的函数没有返回,所以作为子程序更好。编译器注意到实际和伪参数的长度之间的不一致 - 因为我将过程放入一个模块并use编辑它,以便编译器可以检查参数的一致性。他们抱怨将长度为2的字符串传递给长度为10的字符串。如何定义剩余的字符?

module test_mod

contains

subroutine test(name)
implicit none
character(10) :: name
character(3)  :: cutname

write(*,*) '-'//name//'-'             ! Gives output "-AB        -"
                                      ! Space has then been added at the end
cutname(1:3) = name(1:3)
write(*,*) '1-'//cutname//'-'           ! Gives output "-AB -"
                                        ! It seems there is a space then at the end
                                        ! of cutname

write(*,*)  (cutname(1:2) == 'AB')      ! Gives output  T (true)
write(*,*)  (cutname(3:3) == ' ')       ! Gives output  F (false)
write(*,*)  (cutname  == 'AB ')         ! Gives output  F (false)

end subroutine test

end module test_mod



program main
use test_mod
implicit none

call test('AB          ')
end program

当我运行这个版本时,输出是T,T和T,这是我所期望的。

编辑:我建议使用编译器的完整警告和错误检查选项。这就是我快速找到示例问题的方法。使用gfortran:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace

字符串赋值语句不要求双方具有相同的长度。如果RHS短于LHS上的字符串变量,它将在空白处填充。这里,参数应该是一致的,包括长度。