2016-07-10 25 views
0

Die Frage ist, warum ich einen Fehler bekomme, der charlen ist ein real, wenn ich es als die Länge Definition einer Zeichenelementfunktion übergeben. Um genauer zu sein, die Folowing MWEWerke:Charakter elementare Funktion. Geben Sie einen Parameter als Zeichenlänge an die Schnittstelle?

program chararr 
implicit none 
!! 
integer,parameter :: charlen = 20 
!! 
interface 
character(len=20) elemental function adjR(a) 
character(len=*),intent(in) :: a 
end function 
end interface 
!! 
character(charlen) :: test(3), testR(3) 

test = ["hej", "hoj", "haj"] 
testR = adjR(test) 

print*, test 
print*, testR 

end program 

character(20) elemental function adjR(a) 
character(len=*),intent(in) :: a 
adjR = adjustr(a) 
end function 

aber die Linie integer,parameter :: charlen = 20 tut nichts. Wenn ich Definitionen ändern, um die Funktion und Schnittstelle wie diese

character(len=charlen) elemental function adjR(a) 

ich die folgende Fehlermeldung erhalten:

charmin.f90:7:14: 

character(len=charlen) elemental function adjR(a) 
       1 
Error: Expression at (1) must be of INTEGER type, found REAL 

UPDATE

Die Lösung von Alexander im Code ist:

charmin .f90:

program chararr 
use char_mod, only: charlen, adjR 
implicit none 
!! 
!interface 
!character(30) elemental function adjR(a) 
!character(len=*),intent(in) :: a 
!end function 
!end interface 
!!! 
character(charlen) :: test(3), testR(3) 

test = ["hej", "hoj", "haj"] 
testR = adjR(test) 


print*, test 
print*, testR 
print*, charlen !!! it is here 
end program 

char_mod.f90:

module char_mod 

implicit none 
integer,parameter :: charlen = 30 

private 
public charlen, adjR 

contains 

character(charlen) elemental function adjR(a) 
implicit none 
character(len=*),intent(in) :: a 
adjR = adjustr(a) 
end function 

end module 

zu kompilieren:

gfortran -c char_mod.f90 
gfortran charmin.f90 char_mod.f90 -o program 

Antwort

1

charlen wird im Rahmen des Programms definiert, aber die Funktion adjR ist außerhalb dieses Bereichs. Folglich ist charlen nicht zugänglich und da die Funktion implicit none nicht definiert ist, wird sie als reelle Variable interpretiert.

Eine Lösung wäre, adjR in ein Modul zu setzen und charlen eine Modulvariable zu machen.

+0

Vielen Dank! Ich habe eine Reihe von Fehlern, bis ich merkte, dass ich den Schnittstellenblock entfernen muss! Es funktioniert, und ich denke, es ist das erste Mal, dass ich wirklich ein Modul brauche, um ein Problem zu lösen. –