当数组以任意索引范围传递时,多态对象失败

时间:2015-02-06 00:12:29

标签: arrays fortran

我在将字符串转换为整数数组时提供了一个示例。我使用索引范围传递数组。偏移量由0而不是1启动,因此数组中的值将被移位。

s = "1,2,3,5,8"

Call str_to_num_tu (s, ",", tu(1:8))
$ Output: 
$ tu(1):   0 ; tu(2):   1 ; tu(3):   2

Call str_to_num_tu (s, ",", tu)
$ Output:
$ tu(i):   1 ; tu(2):   2 ; tu(3):   3

这是我使用无限多态变量的子程序。

Subroutine str_to_num_tu   &
  (                        &
    s, dl, tu, pos         &
  )  

Class(*), Intent (InOut) :: tu(:)

Character (len=*), Intent (In) :: s, dl
Character (len=*), Intent (In), Optional :: pos

Integer, Allocatable :: ipos(:)
Integer :: nf, npos, ip, i, j, k

 !!$ Sets tu. 
 !!$ s = "Pablo/Neruda"; tu = ["Pablo","Neruda"] 
 !!$ s = "0.2/1.3/1.5"; tu = [0.2,1.3,1.5] 
 nf = nfields (s, dl)

 Write (*,*) ""
 Write (*,*) "nf: ", nf, "; Size(tu): ", Size(tu)

     i = 1
     Do k = 1, nf-1
       j = Index (s(i:), dl)

       Select Type (tu)
       Type Is (Integer (Int32))
         Call str_to_num (s(i:i+j-2), tu(k))
         Write (*,*) Trim (s(i:))
         Write (*,*) "k: ",  k, "; tu(k): ", tu(k)
       End Select    !!$ tu 

       i = i + j

     End Do

     !!$ Gets last field.
     j = Index (s, dl, back=.true.)
     Write (*,*) "j:", j, "; nf:", nf 

     Select Type (tu)
     Type Is (Integer (Int32))
       Call str_to_num (s(j+1:), tu(nf))
     End Select    !!$ tu 

End Subroutine str_to_num_tu

1 个答案:

答案 0 :(得分:2)

详细说明我之前的评论。 (我在这台计算机上没有Fortran,所以语法可能有点难以理解。)我的意思是这样的东西

integer, dimension(6), allocatable :: arr
integer :: ios
character(len=:), allocatable :: str
...
arr = 0
str = "1,2,3,5,8"
read(str,*,iostat=ios) arr

会将str中的前6个整数读入arr的元素。碰巧str只有5个整数,因此arr的最后一个元素保留为0。此处需要iostat,因为尝试读取比str提供的更多整数会在运行时产生文件结束错误。

当然,这种方法也可以归结为实数,字符和逻辑。 Fortran具有内置类型的多态读取。一点。

Fortran会将空格和空格识别为值分隔符(Fortran标准使用单词 delimiter 表示其他内容)。请注意,通过将i / o语句上的decimal模式设置为comma,Fortran会将逗号识别为小数点,并将分号;视为值分隔符。从技术上讲,斜杠也是一个值分隔符,但它也会导致记录的列表导向输入终止,因此实际上并不像值分隔符。

如果担心包含其他值分隔符的字符串,我可能会编写一个函数,该函数接受一个包含此类的字符串,返回一个只有空格的字符串,然后对其执行内部读取。