2016-08-09 54 views
1

Wie behalten Sie den Wert eines Funktionsarguments, wenn Sie es aufrufen, ohne eine neue Variable zu erstellen? Dies ist, wie kann ich das Argument nach Wert übergeben?Übergabe von Argumenten nach Wert in Fortran 95

In diesem Beispielcode:

program what 


integer :: a,b,c,d 

a=1 
b=2 
c=3 

print *, a,b,c 

d=f(val(a),val(b),val(c)) 

print *, d 

print *, a,b,c 

d=f(a,b,c) 

print *, d 

contains 

function f(x,y,z) result(h) 

integer:: x,y,z 
integer :: h 

h=x+y+z 

x=0 
y=0 
z=0 

end function 



end program 

wenn ich die Funktion zum zweiten Mal aufrufen, druckt es nur 0en.

+1

BTW, bitte verwenden Sie einige Einrückungen in Ihren Codes. Hier ist es egal, aber es macht Ihren Code viel lesbarer. –

+0

Normalerweise versuche ich, aber dieser Code war nur um meine Zweifel zu testen, also habe ich mich nicht viel Mühe gegeben; Danke für Ihren Rat :) –

Antwort

3

In Fortran 95 gibt es keinen Weg. Außer einigen sehr unüblichen Erweiterungen, aber sie sind weder Fortran 95 noch irgendwelche anderen Fortran, nur Erweiterungen.

In Fortran 2003 verwenden Sie das Attribut value.

Das Attribut erfordert explizite Schnittstelle, aber Ihr Beispiel hat es, also ist das OK.

+1

Vor der Einführung der Werte (auf der anrufenden Seite) und der Absicht (in) (auf der angerufenen Seite) Spezifikationen war es möglich, (x), (y), (z) in der Funktionsaufruf, um Zuordnungen in der Funktion zu vermeiden, die an den Aufrufer zurückgegeben wird. Es gibt auch eine Wertspezifikation für den Fall, in dem iso_c_binding wirksam ist, was anders ist (kompatibel mit C call by value). – tim18

+0

@ tim18 Du darfst es dann nicht ändern und das ist hier entscheidend. –

+0

Ja, einige dieser Auswahlen müssen oder sollten sich über die Änderung beschweren oder verhindern, aber es scheint eine schlechte Übung zu sein, ein Argument in diesem Kontext zu modifizieren. – tim18