Фортран 90: неклассифицируемое утверждение в (1) - PullRequest
2 голосов
/ 10 сентября 2010

Я изучал фортран 90. В данный момент я изучаю фиктивные аргументы и локальные переменные в функциях.

Одним из упражнений является написание программы, которая запрашиваетПользователь для их имени и фамилии, затем объединяет имена и печатает полное имя.Вот код:

PROGRAM name_test
    IMPLICIT NONE

    ! Declare variables
    CHARACTER(LEN=12) :: first, last
    CHARACTER(LEN=30), EXTERNAL :: full_name

    ! 1. Ask for first name and family name, then read them
    PRINT *, "Please enter your first name"
    READ *, first
    PRINT *, "Please enter your family name"
    READ *, last

    ! 2. Join names together
    full_name(first, last)

    ! 3. Print welcome message
    PRINT *, "Welcome ", full_name(first, last)

END PROGRAM name_test

CHARACTER(LEN=*) FUNCTION full_name(first_name, last_name)
    IMPLICIT NONE

    ! Function which joins 2 names to form a full name

    ! Dummy argument declarations
    CHARACTER(LEN=*), INTENT(IN) :: first_name, last_name

    ! Local variables
    CHARACTER(LEN=LEN(first_name)) :: new_first_name
    CHARACTER(LEN=LEN(last_name)) :: new_last_name

    ! Use ADJUSTL to remove redundant leading blanks
    new_first_name = ADJUSTL(first_name)
    new_last_name = ADJUSTL(last_name)

    ! Join names
    full_name = TRIM(new_first_name)//" "//new_last_name

END FUNCTION full_name

Когда я пытаюсь скомпилировать, возникает ошибка, связанная с вызовом функции в строке 15:

full_name(first, last)

Это ошибка компиляции:

Error: Unclassifiable statement at (1)

1 Ответ

1 голос
/ 10 сентября 2010

У вас есть ошибка в строке full_name (first, last) - хотя это дает мне синтаксическую ошибку, возможно, просто компиляторы разные.

Используемая вами функция возвращает значение, поэтому вы можете использовать его непосредственно в операторе печати.Нет необходимости использовать его до этого, и даже если он использовался до этого, вам все равно нужно присвоить его значение (возвращаемое) чему-то вроде

string = full_name (first,последний)

В любом случае, я немного сократил его, так что вот так.

  program name_test
  implicit none

  character(len=12) :: first, last
  character(len=30), external :: full_name

  write(*,'("Please enter your first name : ",\)'); read(*,*)first
  write(*,'("Please enter your last name  : ",\)'); read(*,*)last
  write(*,'("Welcome ",A)')full_name(first,last)

  end program name_test


  function full_name(first,last)
  implicit none

  character(len=*) :: first, last
  character(len=30) :: full_name

  full_name = trim(adjustl(first))//" "//trim(adjustl(last))
  end function full_name
...