arrays - leer - imprimir cadena de caracteres en c
Cómo pasar la matriz de caracteres a la cadena (1)
Comenzando con una variante más simple del problema, para crear un carácter escalar de cierta longitud a partir de una matriz de rango uno de longitud uno que tenga el mismo tamaño que la longitud determinada, puede usar una declaración de asignación.
! 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
(Una declaración FORALL podría ser un poco más conciso, particularmente en F2008).
Tu problema simplemente agrega otro rango a lo anterior.
! 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
Tenga en cuenta que un escalar en Fortran es muy distinto de una matriz. Si asigna un escalar a una matriz, asigne el valor de ese escalar a cada elemento de la matriz, como si hubiera escrito arrary(1) = scalar ; array(2) = scalar ; ...
arrary(1) = scalar ; array(2) = scalar ; ...
Tenga en cuenta también que la asignación intrínseca de caracteres trunca (o almohadillas) si la longitud del lado derecho no coincide con la longitud del lado izquierdo.
Por lo tanto en tu código:
FILE_SIM_all(1:29,1) = "/Users/toto/Documents/toto.nc"
que asigna un escalar a una sección de matriz, no hace nada útil, a menos que quieras 29 caracteres de barra única!
El mensaje de error en su ejemplo surge porque está tratando de asignar una sección de matriz de tamaño 29 a un escalar (que pasa a ser un objeto de carácter de longitud 29). En general, no puede asignar matrices (rango de uno o más) a escalares (rango de cero).
Me pregunto cómo podría pasar de una matriz de caracteres a varias cadenas de caracteres. De hecho, tengo una matriz de caracteres que contiene 17 rutas de archivos. Digamos :
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...
Me gustaría convertir recursivamente (dentro de un ciclo for con sim = 1,17) la fila "sim" de FILE_SIM_todo a una cadena de caracteres. Digamos algo como
do sim=1,17
FILE_SIM(1:29) = FILE_SIM_all(1:29,sim)
enddo
Pero recibo el siguiente error al compilar mi programa:
error # 6366: las formas de las expresiones de matriz no se ajustan. [FILE_SIM]
¿Qué estoy haciendo mal? Gracias !