2013-08-26 55 views
5

Tôi đang học Fortran, tại thời điểm này đối số tùy chọn.đối số tùy chọn trong các chức năng fortran

Tôi có thể sử dụng chúng với các chương trình con với intent(in)intent(inout), nhưng với các hàm đối số tùy chọn chỉ hoạt động với intent(in), phải không? Với intent(inout) tôi nhận được lỗi phân đoạn.

+2

inout nên làm việc xem tại đây http://stackoverflow.com/questions/3121954/fortran-90-presence-of-optional-arguments – agentp

+1

Có lẽ segfault đến từ việc không kiểm tra sự hiện diện của đối số? –

+1

Có thể bạn nên đăng một ví dụ tối thiểu (không) làm việc ... – Stefan

Trả lời

4

ok tôi thấy vấn đề này, tôi đã sử dụng biến ngay cả khi không có mặt, như thế:

real function foo(x, tol) 
    real, intent(in) :: x 
    real, optional, intent(inout) :: tol 
    if(.not. present(tol)) tol = 1e-6 
    !... 
end function foo 

Nhưng tôi muốn sử dụng nó ngay cả khi không có mặt và thiết lập giá trị mặc định, giống như khi trong C++ chúng tôi làm điều gì đó tương tự như vậy

double foo(double x, double tol=1e-6) 

Tôi có thể làm điều đó bằng cách nào? thanks

+2

Bạn không thể xác định/gán/sử dụng một đối số tùy chọn không có mặt. Bạn phải sử dụng một biến khác. Ví dụ, tên bạn tùy chọn var * opt_tol *, và xác định * tol * trong chương trình của bạn (* nếu có (opt_tol) thì tol = opt_tol khác tol = giá trị mặc định *). Xem phần 12.4.1.6 của tiêu chuẩn [Fortran 2003] (http://www.j3-fortran.org/doc/year/04/04-007.pdf). –

+0

ok Tôi undestood, nhờ @arbautjc – rosilho

+0

http://stackoverflow.com/questions/18302083/fortran-95-present-statement-using-ftn95-and-plato – agentp