2010-10-16 29 views
2

我有一個用戶定義類型vector。在另一種類型中,我有一個可分配的向量數組。我想要一個指向這個可分配數組的單個向量的指針。所以,我想我會做到這一點:我可以有一個指向可分配數組組件中的項目的指針嗎?

type another_type 
    type(vector),allocatable,target::my_vectors(:) 
end type 

type(vector),pointer::pointed_vec 

但是當我編譯,編譯器會抱怨說:

This attribute specification is not valid for a component definition statement. 

我可以從指針到單個項目一個可分配的數組?可能嗎?

回答

0

是的,您可以指向可分配數組中的單個項目,但是您的數組my_vectors是標量,它不具有allocatable屬性。也許這是給編譯器錯誤的聲明。隨着gfortran我得到一個編譯時消息:

TYPE(vector),ALLOCATABLE,TARGET :: my_vectors 
           1 
Error: Scalar object 'my_vectors' at (1) may not be ALLOCATABLE 

儘量聲明爲my_vectors(:)

+0

好點,但那只是我沒有正確記住我的代碼。我確實有一個數組聲明,而不是一個標量...... – 2010-10-18 06:08:44

+1

另外我錯讀了你的allocatable也在類型定義中。不確定大編輯禮儀,所以增加了新的答案。 – Deditos 2010-10-18 10:35:24

4

只有變量或派生類型的實際實例可能具有TARGET屬性。因此,第二個類型定義中的可分配元素不能成爲目標,因爲這只是對類型應該是什麼樣子的描述,如果您喜歡,可以使用模板。

但是,您可以給出一個類型爲TARGET屬性的實例,然後使用適當聲明的Fortran指針指向它的任何組件部分。

Editted:一種替代,甚至更多你以後,是隻給向量數組類型的POINTER屬性,它隱使其既合法指針對象,並可以用來分配內存。在使用它來分配內存之後,您必須確保不會重新指定指針(下例中的v),因爲那樣您就會發生泄漏。

PROGRAM so_pointtype 

    IMPLICIT NONE 

    TYPE vec 
    INTEGER :: x = 2, y = 3 
    END TYPE vec 

    TYPE foo 
    TYPE(vec),POINTER :: v(:) 
    END TYPE foo 

    TYPE(foo) :: z 
    TYPE(vec),DIMENSION(:),POINTER :: p2 => NULL() 

    ALLOCATE(z%v(3)) 

    PRINT*,z%v(:) 

    p2 => z%v(:) 

    PRINT*,p2 

END PROGRAM so_pointtype 
+0

考慮到錯誤是有道理的,但這非常令人沮喪!這意味着我在我的類型中做什麼取決於我是否已經在類型層次結構中進一步聲明瞭某些東西作爲目標。嗯。 – 2010-10-18 13:08:22

+0

好的,我認爲編輯後的答案就是你所追求的。 – Deditos 2010-10-19 11:54:49

+0

問題是我的vecs數組是可分配的,這是編譯器最初抱怨的。但現在我已經設定了更高的目標。 – 2010-11-01 06:19:06

相關問題