2013-02-12 82 views
0

在fortran中,假設未分配數組的狀態爲.not.allocated,並且如果使用save屬性聲明可分配數組的狀態在調用之間保留,那麼安全嗎?換句話說,除非輔助輸出格式的差異,是安全的假設,下面的程序將始終導致輸出:分配數組的初始狀態

First time here 
Been here before 

測試程序:

program main 
    call sub() 
    call sub() 
    end program main 

    subroutine sub() 
    real,save,allocatable,dimension(:) :: a 
    if(.not. allocated(a))then 
     print*,"First time here" 
     allocate(a(10)) 
    else 
     print*,"Been here before" 
    endif 
    end subroutine sub 

我問,主要是因爲我知道,你不能假定一個指針的默認關聯爲.not.associated

+0

FWIW,沒有'save'程序是非法的Fortran 90,但合法的Fortran 95 – 2013-02-12 19:23:05

+0

@VladimirF - 很有趣。如果該程序會導致它在f90中是非法的? – mgilson 2013-02-13 02:37:03

+0

不確定這是否正確。據我所知,f90和f95之間的變化與此處相關的是,後者指定一旦可分配數組超出範圍,它就會自動釋放。因此,在f90中,你可能會遇到內存泄漏(「可能」,因爲標準沒有禁止沿着f95行重新分配),而在f95中肯定不會。因此,我的讀法是,在F90中,行爲是由實施定義的,由於潛在的內存泄漏,但實際上不合法,因此在f95中所有的都是幸福,甜蜜和光明。 – 2013-02-13 09:01:15

回答

4

是的!

現在我發現,你需要30個字符...

+0

不好意思問一個只需要'yes' /'no'的問題。我不得不填補我的一些答案,如下所示:-) – mgilson 2013-02-12 17:08:14

0

是的,這是與Fortrans分配數組漂亮的事情之一。但是,如果因爲某些原因,你不得不使用指針,你可以通過achive類似的效果:

program main 
    call sub() 
    call sub() 
end program main 

subroutine sub() 
    real, pointer, dimension(:), save :: a => null() 
    if(.not. associated(a))then 
    print*,"First time here" 
    allocate(a(10)) 
    else 
    print*,"Been here before" 
    endif 
end subroutine sub 

save屬性是可選在這裏,因爲在變量聲明中分配這意味着任何方式。

+0

是的,我意識到這一點......雖然根據上面的帖子的討論,這個特性在Fortran 95(I相信)。不是Fortran 90。 – mgilson 2013-02-13 13:02:44