2010-09-10 3 views
2

J'ai passé un manuel à apprendre le fortran 90. En ce moment j'apprends des arguments fictifs et des variables locales dans les fonctions. Un des exercices consiste à écrire un programme qui demande à l'utilisateur son prénom et son nom, puis joint les noms et imprime le nom complet. Voici le code:Fortran 90: déclaration inclassable à (1)

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 

Lorsque je tente de compiler, il arrive avec une erreur se référant à l'appel de fonction à la ligne 15:

full_name(first, last) 

Ceci est l'erreur de compilation:

Error: Unclassifiable statement at (1) 

Répondre

1

Vous avez une erreur sur la ligne full_name (premier, dernier) - bien qu'il me donne une erreur de syntaxe, il se peut que les compilateurs soient différents.

La fonction que vous utilisez renvoie une valeur, vous pouvez donc l'utiliser directement dans l'instruction print. Il n'est pas nécessaire de l'utiliser avant cela, et même s'il a été utilisé avant cela, vous devez toujours affecter sa valeur (celle qu'il a renvoyée) à quelque chose comme

string = nom complet (prénom, nom)

De toute façon, je l'ai raccourci un peu alors voilà.

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 
Questions connexes