2012-02-03 22 views
7

Giả sử tôi có một mô-đun trong đó xác định một số các hằng số cơ bản nhưBao gồm một mô-đun hơn một lần

integer, parameter :: i8 = selected_int_kind(8) 

Nếu tôi bao gồm trong chương trình chính của tôi và tôi cũng bao gồm một mô-đun mà hiện một số thứ khác (gọi này mô-đun functions) nhưng functions cũng use s constants, sau đó tôi về cơ bản bao gồm constants hai lần trong chương trình chính của mình?

Nếu có, điều này có tệ không? Nó có thể nguy hiểm ở tất cả để bao gồm một mô-đun quá nhiều lần trong một chương trình?

+1

Không, thực hiện điều này là tốt. Tất cả những gì bạn đang làm với câu lệnh 'use' là đưa các biến vào một phạm vi chương trình con. Nó không giống như khai báo các biến mỗi khi chúng là 'use''d. Điều duy nhất cần thận trọng là * phụ thuộc vòng tròn *, trong đó mô-đun 'A' sử dụng mô đun' B' và mô-đun 'B' sử dụng mô-đun' A'. Điều này không được phép. – Chris

+1

cảm ơn, hãy đặt câu trả lời này để tôi có thể cung cấp cho bạn một dấu kiểm! – drjrm3

+0

Cảm ơn, tôi đã làm và thêm một chút thông tin nữa. – Chris

Trả lời

11

Không, thực hiện điều này là tốt. Tất cả những gì bạn đang làm với câu lệnh use là cung cấp quyền truy cập vào các biến và chức năng được xác định trong mô-đun của bạn qua sử dụng liên kết. Nó không giống như khai báo các biến mỗi khi chúng là use 'd (chúng thực sự được redeclared).

Điều duy nhất cần phải cảnh giác với những phụ thuộc vòng tròn, nơi mô-đun A sử dụng mô-đun B và module B sử dụng mô-đun A. Điều này không được phép.

Chỉnh sửa: Từ Metcalf et al. Fortran 95/2003 giải thích, pg. 72:

Mô-đun có thể chứa các câu lệnh use truy cập các mô-đun khác. Nó không được tự truy cập trực tiếp hoặc gián tiếp thông qua một chuỗi các tuyên bố use, ví dụ: a truy cập bb truy cập a.

Trong khi báo giá này không trực tiếp trả lời câu hỏi của bạn, nó nhắc lại rằng điều duy nhất bạn không thể làm là có sự phụ thuộc vòng tròn. Vì vậy, các điều sau đây hoàn toàn hợp lệ:

module one_def 
    implicit none 
    integer, parameter :: one=1 
end module one_def 

module two_def 
    use one_def, only : one 
    implicit none 
    integer, parameter :: two=one+one 
end module two_def 

program test 
    use one_def, only : one 
    use two_def, only : two 
    implicit none 

    print*, two == one+one ! This prints .True. 

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