如何将字符数组传递给字符串 [英] How to pass character array into string

查看:87
本文介绍了如何将字符数组传递给字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道如何从一个字符数组转换为多个字符串.事实上,我有一个包含 17 个文件路径的字符数组.让我们说:

I am wondering how could I go from a character array to several character strings. Indeed, I have a character array containing 17 file path. Lets say :

character, dimension(29,17) :: FILE_SIM_all
character, length(29) :: FILE_SIM

! Declarations end

FILE_SIM_all(1:29,1) = "/Users/toto/Documents/toto.nc"
FILE_SIM_all(1:29,2) = etc...

我想将 FILE_SIM_all 的sim"行递归地(在 sim=1,17 的 for 循环中)转换为字符串.让我们说一些像

I would like to convert recursively (inside a for loop with sim=1,17) the "sim" row of FILE_SIM_all to a character string. Lets say something like

do sim=1,17
    FILE_SIM(1:29) = FILE_SIM_all(1:29,sim)
enddo

但是在编译我的程序时出现以下错误:

But I'm getting the following error when compilling my program :

错误 #6366:数组表达式的形状不符合.[FILE_SIM]

error #6366: The shapes of the array expressions do not conform. [FILE_SIM]

我做错了什么?谢谢!

推荐答案

从问题的一个更简单的变体开始,从与一定的长度,可以使用赋值语句.

Starting with a simpler variant of the problem, to create a character scalar of a certain length from an rank one array of length one characters that has the same size as the certain length, you can use an assignment statement.

! Declare vector to be an rank one array of size ten of 
! length one characters.
CHARACTER(1) :: vector(10)
! Declare scalar to be a character scalar of length ten, 
! so LEN(scalar) == SIZE(vector)
CHARACTER(10) :: scalar
INTEGER :: i     ! Loop index.

! Define `vector`.  Note that the right hand side of the 
! assignment is a rank one array of ten length one characters, 
! consistent with the definition of vector.
vector = (/ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' /)

! Loop over the elements of `vector` and the characters of 
! `scalar` and transfer the individual characters.
DO i = 1, LEN(scalar)  ! or SIZE(vector)
  scalar(i:i) = vector(i)
END DO

(FORALL 语句可能更简洁一些,尤其是在 F2008 中.)

(A FORALL statement might be a little more concise, particularly in F2008.)

你的问题只是在上面增加了另一个等级.

Your problem simply adds another rank to the above.

! Declare `matrix` to be an rank two array of shape (10,2) of 
! length one characters.
CHARACTER(1) :: `matrix`(10,2)
! Declare `list` to be a rank one array of size 2 and 
! length ten, so LEN(list) == SIZE(matrix,1) and 
! SIZE(list) == SIZE(matrix,2)
CHARACTER(10) :: list(2)
INTEGER :: i     ! Inner Loop index.
INTEGER :: j     ! Outer loop index.

! Define `matrix`.  Note that the right hand side of each 
! assignment is a rank one array of ten length one characters, 
! consistent with the definition of a column of matrix.
matrix(:,1) = (/ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' /)
matrix(:,2) = (/ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' /)

! Loop over the columns of matrix and the elements of list.
DO j = 1, SIZE(list)   ! or SIZE(matrix,1)
  ! Loop over the rows of `matrix` and the characters of 
  ! an element of `list` and transfer the individual characters.
  DO i = 1, LEN(list)   ! or SIZE(matrix,2)
    list(j)(i:i) = matrix(i,j)
  END DO
END DO

请注意,Fortran 中的标量与数组非常不同.如果将标量分配给数组,则将该标量的值分配给数组中的每个元素,就好像您已经编写了 arrary(1) = scalar ;数组(2) = 标量;...

Note that a scalar in Fortran is very distinct from an array. If you assign a scalar to an array, you assign the value of that scalar to every element in the array, as if you had written arrary(1) = scalar ; array(2) = scalar ; ...

另请注意,如果右侧的长度与左侧的长度不匹配,则内部字符分配会截断(或填充).

Note also that intrinsic character assignment truncates (or pads) if the length of the right hand side does not match the length of the left hand side.

因此在您的代码中:

FILE_SIM_all(1:29,1) = "/Users/toto/Documents/toto.nc"

将标量分配给数组部分,不会做任何有用的事情,除非您想要 29 个单斜杠字符!

which assigns a scalar to an array section, does not do anything useful, unless you want 29 single slash characters!

您的示例中出现错误消息是因为您试图将大小为 29 的数组部分分配给标量(恰好是长度为 29 的字符对象).通常,您不能将数组(秩为 1 或更大)分配给标量(秩为零).

The error message in your example arises because you are trying to assign an array section of size 29 to a scalar (that happens to be a character object of length 29). In general, you cannot assign arrays (rank of one or greater) to scalars (rank of zero).

这篇关于如何将字符数组传递给字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆