recursion - programas - funciones intrinsecas fortran
Fortran CHARACTER(LEN=*) solo se aplica al argumento ficticio o PARÁMETRO (1)
Quiero imprimir la siguiente salida
*****
****
***
**
*
usando la subrutina recursiva. Y mi código es el siguiente:
PROGRAM PS
IMPLICIT NONE
CALL print_star(5, ''*'')
CONTAINS
RECURSIVE SUBROUTINE print_star(n, star)
INTEGER :: n
CHARACTER(LEN = *) :: star
CHARACTER(LEN = *) :: new_star
IF (n > 1) THEN
new_star = star // ''*''
CALL print_star(n - 1, new_star)
END IF
print *, star
END SUBROUTINE print_star
END PROGRAM PS
Luego devuelve el error:
CHARACTER(LEN = *) :: new_star
1
Error: Entity with assumed character length at (1) must be a dummy argument or a PARAMETER
Si simplemente evito definir new_star
, y simplemente new_star
CALL print_star(n - 1, star // ''*'')
entonces el programa funciona como se esperaba Me pregunto de qué se trata el error y cómo resolverlo.
CHARACTER (*) declara un objeto de carácter de longitud asumida. Eso significa que el objeto toma su longitud ("lo asume") de otra cosa.
En el caso de una declaración CHARACTER (*) para un argumento ficticio, la longitud se supone a partir de la longitud del argumento real.
En el caso de una constante CHARACTER (*) (un PARÁMETRO), la longitud se asume a partir del valor dado a la constante.
Desde el punto de vista del concepto de lenguaje, no hay nada de lo que su variable new_star
pueda asumir su longitud, en el punto en el que se declara. Las reglas de idioma que resultan en el mensaje de error que ve reflejan esto.
Pero sabes cuál es la longitud de new_star
que se le debe dar a la lógica más adelante en tu programa; necesita ser una más que la longitud del argumento de star
ficticia. Entonces puedes declararlo apropiadamente:
CHARACTER(LEN(star) + 1) :: new_star
Como alternativa, Fortran 2003 introduce objetos de caracteres de longitud diferida. Estos son objetos asignables o punteros, donde la longitud se especifica en el momento en que se asigna o asocia el objeto. Se declaran utilizando un especificador de longitud de :