2012-11-21 29 views
5

xem xét:Có điều gì sai khi chuyển một mảng chưa được phân bổ đến một thường trình không có giao diện rõ ràng không?

program main 
real, allocatable, dimension(:) :: foo 
integer n 
n=10 
call dofoo(foo,n,1) 
allocate(foo(n)) 
call dofoo(foo,n,0) 
end program main 

subroutine dofoo(foo,n,mode) 
real foo(n) 
integer i,n,mode 
if(mode.eq.1)then 
    n=6 
    return 
endif 
do i=1,n 
    foo(i)=i 
enddo 
return 
end subroutine dofoo 

Có gì không ổn với đoạn code trên? (Nó hoạt động với gfortran) Tôi vượt qua trong một mảng không được phân bổ lần đầu tiên, nhưng tôi không chạm vào nó - Có bất cứ điều gì trong tiêu chuẩn có thể gây ra điều này để hành xử một cách phụ thuộc vào hệ thống?

Trả lời

5

Bạn gần như đã trả lời câu hỏi của riêng bạn. Có, theo tiêu chuẩn, nó luôn luôn là bất hợp pháp để vượt qua một mảng phân bổ unallocated như một đối số thực tế nếu bạn không có một giao diện trong phạm vi.

Nếu bạn có giao diện trong phạm vi, nó chỉ hợp pháp nếu đối số giả cũng có thể phân bổ.

Và vâng tôi đã bị nó cắn. Công việc của tôi xung quanh đã được phân bổ cho kích thước bằng không trước cuộc gọi.

+0

Cảm ơn. Tôi đã lo lắng rằng đây là trường hợp. Tôi không biết tiêu chuẩn phải nói gì (tôi rất quen thuộc với tiêu chuẩn f77, nhưng tôi chưa thực sự đọc hầu hết tiêu chuẩn f90) – mgilson

+0

Như một lưu ý phụ, đoạn mã trên hoạt động với gfortran (sau tôi sửa lỗi ra) – mgilson

+3

Việc truyền các mảng phân bổ xung quanh không được xóa cho đến khi đạt tiêu chuẩn F95. Trạng thái và kích thước được phân bổ là _part_ của biến mảng phân bổ. Điều đó quan trọng bởi vì những thứ như ý định (trong) hoặc ý định (ra) sau đó cho bạn biết không chỉ nếu _values_ của mảng có thể thay đổi nhưng cho dù kích thước hoặc trạng thái phân bổ có thể thay đổi hay không. Nếu không có một giao diện rõ ràng, một chương trình sẽ phải thừa nhận điều tồi tệ nhất khi truyền một mảng có thể phân bổ - nó có thể thậm chí không biết kích thước nữa khi trả về. Đó là một hình phạt hiệu suất rất lớn trong trường hợp thông thường, vì vậy nó đã được quyết định rằng người ta phải có giao diện rõ ràng. –