resueltos programas programación problemas intrinsecas funciones ejemplos comentarios comandos ciclo arreglos aprender recursion fortran character

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 :