2013-07-19 16 views
8

Próbuję nauczyć się pracować z funkcjami. Mam następujący kod:Funkcja nie ma domyślnego typu

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 

Kiedy skompilować (z gfortran 4.1.2), pojawia się następujący błąd:

In file test.f90:4 

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

Odpowiedz

9

przesunąć linię

end program 

do końca pliku źródłowego i, w jego miejsce, napisz wiersz

contains 

Jak napisałeś swój program, nie ma wiedzy o funkcji test, o czym mówi ci kompilator. Zaproponowałem jeden ze sposobów, w jaki możesz dostarczyć programowi wiedzę, której potrzebuje, ale są też inne. Ponieważ jesteś uczniem, zostawię cię, aby dowiedzieć się, co się dzieje w szczegółach.

+0

OK, czy jest jakiś sposób, w jaki mogę napisać tę funkcję w innym pliku do ponownego wykorzystania w innych programach? – sodiumnitrate

+0

Tak, jak napisałem * są inni *. Możesz napisać 'moduł' w innym pliku źródłowym i ponownie użyć funkcji w ten sposób. Skonsultuj się z samouczkiem Fortran. –

6

wszelki wypadek ktoś ma ten sam problem alternatywny sposób (zwłaszcza w przypadku omówione w komentarzu) jest dodanie

integer,external :: test 

po

implicit none 

w programie głównym.

+1

Przyjęta odpowiedź jest DUŻO lepsza, ponieważ zapewnia jawny interfejs i umożliwia sprawdzenie typów argumentów. –

+1

"lepiej" ... cóż, dla początkującego to rozwiązanie jest po prostu łatwiejsze, a więc i lepsze w pewnym sensie. Nie wymaga dodatkowej wiedzy na temat pojęć takich jak moduły lub zawiera. Oczywiście zaakceptowana odpowiedź jest bardziej elegancka i oszczędza. Więc całkowicie się zgadzam w tym sensie, że wolałbym to dla moich programów. Ale jako początkujący zawsze byłem wdzięczny za proste rozwiązania, mimo że mogą one nie rozwiązać problemu w najbardziej ogólny sposób. – PeMa

+3

Nie zgadzam się. Prowadzisz początkujących do miejsca, w którym mogą zostać uwięzieni starym stylem, który został porzucony z dobrych powodów 20 lat temu. Kiedy nauczam programowania Fortran na naszej uczelni, organizacja programu i moduły to jedna z pierwszych i najważniejszych rzeczy. Nie pokazuję, jak napisać podprogram przed wprowadzeniem modułu jako pojemnika, w którym można je umieścić. –

0

Wystarczy umieścić to:

program main 
    implicit none 

Test całkowitą

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

Musisz zadeklarować funkcję jako zmienną dla kompilatora znać rodzaj zwracaną przez funkcję.