2013-07-19 16 views
8

Ich versuche zu lernen, mit Funktionen zu arbeiten. Ich habe den folgenden Code:Funktion hat keinen impliziten Typ

program main 
    implicit none 

    write(*,*) test(4) 
end program 

integer function test(n) 
    implicit none 
    integer, intent(in) :: n 
    integer :: i, ans 

    ans=1 
    do i=1,n 
    ans=ans*i 
    enddo 

    test=ans 
end function test 

Wenn ich kompilieren (mit gfortran 4.1.2), erhalte ich folgende Fehlermeldung:

In file test.f90:4 

    write(*,*) test(4) 
      1 
Error: Function 'test' at (1) has no IMPLICIT type 

Antwort

9

Bewegen Sie die Linie

end program 

bis zum Ende Ihrer Quelldatei und schreiben statt dessen die Zeile

contains 

Wie Sie Ihr Programm geschrieben haben, hat es keine Kenntnisse über die Funktion test, was der Compiler Ihnen sagt. Ich habe eine der Möglichkeiten vorgeschlagen, wie Sie das Programm mit dem erforderlichen Wissen versorgen können, aber es gibt noch andere. Da du ein Lerner bist, überlasse ich dir, herauszufinden, was im Detail passiert.

+0

Ok, also gibt es irgendeine Möglichkeit, wie ich diese Funktion in eine andere Datei schreiben kann, um sie in anderen Programmen wiederzuverwenden? – sodiumnitrate

+0

Ja, wie ich geschrieben habe * gibt es andere *. Sie könnten ein 'Modul' in eine andere Quelldatei schreiben und die Funktion auf diese Weise wiederverwenden. Konsultieren Sie Ihr Fortran-Tutorial. –

6

Nur für den Fall, jemand hat das gleiche Problem, einen alternativen Weg (vor allem für den Fall, in dem Kommentar diskutiert)

integer,external :: test 

nach

implicit none 

im Hauptprogramm hinzuzufügen ist.

+1

Die angenommene Antwort ist VIEL besser, da sie die explizite Schnittstelle bereitstellt und die Überprüfung der Argumenttypen ermöglicht. –

+1

'besser' ... naja, für einen Anfänger ist diese Lösung in einem gewissen Sinne einfacher und damit auch besser. Es erfordert kein zusätzliches Wissen über Konzepte wie Module oder enthält. Natürlich ist die angenommene Antwort eleganter und sicherer. Ich stimme dem völlig zu, dass ich es für meine Programme bevorzuge. Aber als Anfänger war ich immer dankbar für einfache Lösungen, auch wenn sie das Problem vielleicht nicht allgemein lösen. – PeMa

+3

Ich stimme nicht zu. Sie führen die Anfänger in das Gebiet, wo sie mit dem alten Stil gefangen werden können, der vor 20 Jahren aus guten Gründen aufgegeben wurde. Wenn ich Fortran-Programmierung an unserer Universität lehre, ist die Programmorganisation und -module eines der ersten und wichtigsten Dinge. Ich zeige nicht, wie man eine Subroutine schreibt, bevor man ein Modul als einen Container einführt, wo man sie platzieren kann. –

0

Genau dies setzen:

program main 
    implicit none 

Integer-Test

write(*,*) test(4) 
end program 
... 

Sie benötigen die Funktion als Variable für den Compiler zu erklären, den Rückgabetyp der Funktion zu kennen.