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?
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
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
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. –