2013-10-23 15 views
5

Tôi cần trong một chương trình để truyền một số mảng có thể phân bổ tới các chương trình con, và tôi cần biết cách tôi làm theo tiêu chuẩn hay không.fortran, truyền các mảng phân bổ tới một chương trình con với các giới hạn bên phải

Nếu bạn biết nơi tôi có thể tìm kiếm tiêu chuẩn của fortran, hãy cho tôi biết.

Dưới đây là một mã nhỏ mà tốt hơn sẽ giải thích hơn lời nói

program test 

use modt99 

implicit none 

real(pr), dimension(:), allocatable :: vx 

allocate(vx(-1:6)) 
vx=(/666,214,558,332,-521,-999,120,55/) 
call test3(vx,vx,vx) 
deallocate(vx) 

end program test 

với các module modt99

module modt99 

contains 
subroutine test3(v1,v2,v3) 
    real(pr), dimension(:), intent(in) :: v1 
    real(pr), dimension(0:), intent(in) :: v2 
    real(pr), dimension(:), allocatable, intent(in) :: v3 

    print*,'================================' 
    print*,v1(1:3) 
    print*,'================================' 
    print*,v2(1:3) 
    print*,'================================' 
    print*,v3(1:3) 
    print*,'================================' 

end subroutine test3 


end module modt99 

trên màn hình, tôi nhận được

================================ 
    666.000000000000  214.000000000000  558.000000000000  
================================ 
    214.000000000000  558.000000000000  332.000000000000  
================================ 
    558.000000000000  332.000000000000  -521.000000000000  
================================ 

Vậy là ba cách của các đối số giả trong chương trình con test3 hợp pháp (trong phiên bản nào của fortran, 90, 95, 2003?) và là hành vi của chúng bình thường?

Trả lời

5

Phiên bản đầu tiên chuyển mảng mảng tới chương trình con. Lưu ý rằng thông tin biên không được truyền theo cách này, các mảng được giả định bắt đầu tại 1 và đi đến size(array). Cách thứ hai cũng giống như cái đầu tiên, nhưng bạn tự đặt đường biên dưới thành 0, đó là lý do tại sao in v3(1:3) cung cấp cho bạn các giá trị có độ lệch là 1.

Cách thứ ba vượt qua tất cả thông tin mảng cho chương trình con (bao gồm cả ranh giới), do đó lập chỉ mục "đúng". Thông qua allocatable mảng đã được giới thiệu với Fortran 2003.

Ngoài thực tế là bạn có vấn đề bí danh (chuyển cùng một biến cho ba đối số giả khác nhau), cả ba phiên bản đều hợp pháp.

Bạn có thể tìm thấy tất cả tài liệu của các tiêu chuẩn here.

Đặc biệt, có một cái nhìn tại Fortran 2003 Standard, Ch. 5.1.2.5 DIMENSION attribute để thấy sự khác biệt giữa giả hìnhhình chậm mảng trong các đối số giả.

+0

cảm ơn câu trả lời của bạn, nó sẽ giúp tôi rất nhiều. Trong liên kết bạn đưa ra, nó có vẻ là ok trong f95 quá, hay không? – user2910558

+0

* Tất cả * Các tài liệu chuẩn được cung cấp ở đó, bắt đầu từ * Fortran cho IBM 704 * (1957!). –

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