2013-07-19 29 views
8

Tôi đang cố gắng học cách làm việc với các chức năng. Tôi có đoạn mã sau:Chức năng không có loại ngầm

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 

Khi tôi biên dịch (với gfortran 4.1.2), tôi nhận được lỗi sau:

In file test.f90:4 

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

Trả lời

9

Di chuyển dòng

end program 

đến cùng của tệp nguồn và tại vị trí của nó, hãy viết dòng

contains 

Như bạn đã viết chương trình của bạn nó không có kiến ​​thức về chức năng test, đó là những gì trình biên dịch nói với bạn. Tôi đã gợi ý một trong những cách mà bạn có thể cung cấp cho chương trình những kiến ​​thức cần thiết, nhưng có những cách khác. Vì bạn là một người học, tôi sẽ để bạn tìm ra những gì đang xảy ra chi tiết.

+0

Ok, vậy có cách nào để tôi có thể viết hàm này trong một tệp khác để sử dụng lại trong các chương trình khác không? – sodiumnitrate

+0

Vâng, như tôi đã viết * có những người khác *. Bạn có thể viết một 'module' trong một tệp nguồn khác và tái sử dụng hàm theo cách đó. Tham khảo hướng dẫn Fortran của bạn. –

6

Chỉ trong trường hợp, một người nào đó có cùng một vấn đề một cách khác (đặc biệt là đối với trường hợp được thảo luận trong các bình luận) là thêm

integer,external :: test 

sau

implicit none 

trong chương trình chính.

+1

Câu trả lời được chấp nhận là MUCH tốt hơn, bởi vì nó cung cấp giao diện rõ ràng và cho phép kiểm tra các loại đối số. –

+1

'tốt hơn' ... tốt, đối với người mới bắt đầu, giải pháp này dễ dàng hơn và do đó cũng tốt hơn, theo nghĩa nào đó. Nó không đòi hỏi kiến ​​thức bổ sung về các khái niệm như mô-đun hoặc chứa. Tất nhiên câu trả lời được chấp nhận là thanh lịch hơn và tiết kiệm. Vì vậy, tôi hoàn toàn đồng ý với ý nghĩa rằng tôi thích nó cho các chương trình của tôi. Nhưng với tư cách là người mới bắt đầu, tôi luôn biết ơn các giải pháp đơn giản, mặc dù họ có thể không giải quyết vấn đề một cách tổng quát nhất. – PeMa

+3

Tôi không đồng ý. Bạn đang hướng dẫn những người mới bắt đầu đến khu vực nơi họ có thể bị mắc kẹt với phong cách cũ đã bị bỏ rơi vì những lý do chính đáng cách đây 20 năm. Khi tôi dạy chương trình Fortran tại trường đại học của chúng tôi, tổ chức và mô-đun chương trình là một trong những điều đầu tiên và quan trọng nhất. Tôi không chỉ cách viết một chương trình con trước khi giới thiệu một mô-đun như một vùng chứa nơi đặt chúng. –

0

Chỉ cần đặt này:

program main 
    implicit none 

nguyên kiểm tra

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

Bạn cần phải khai báo hàm như là một biến cho trình biên dịch biết kiểu trả về của hàm.

Các vấn đề liên quan