从问题的简单变体开始,要从长度为一的字符数组中创建一个与指定长度相同的字符标量,可以使用赋值语句。
CHARACTER(1) :: vector(10)
CHARACTER(10) :: scalar
INTEGER :: i
vector = (/ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' /)
DO i = 1, LEN(scalar)
scalar(i:i) = vector(i)
END DO
使用FORALL语句可能更加简洁,特别是在F2008中。
您的问题只是将上述内容添加了另一个级别。
CHARACTER(1) :: `matrix`(10,2)
CHARACTER(10) :: list(2)
INTEGER :: i
INTEGER :: j
matrix(:,1) = (/ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' /)
matrix(:,2) = (/ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' /)
DO j = 1, SIZE(list)
DO i = 1, LEN(list)
list(j)(i:i) = matrix(i,j)
END DO
END DO
请注意,在Fortran中,标量与数组是非常不同的。如果您将一个标量赋值给一个数组,您将该标量的值分配给数组中的每个元素,就好像您编写了
arrary(1) = scalar ; array(2) = scalar ; ...
。
还要注意,内置字符赋值如果右侧的长度与左侧的长度不匹配,则会截断(或填充)。
因此,在您的代码中:
FILE_SIM_all(1:29,1) = "/Users/toto/Documents/toto.nc"
这个语句给一个数组部分赋值标量,除非你想要29个单斜杠字符,否则没有任何用处!
在您的示例中出现错误消息是因为您试图将大小为29的数组部分赋值给标量(长度为29的字符对象)。一般来说,您不能将数组(等级为1或更高)赋值给标量(等级为0)。