2014-02-06 19 views
1

我'中號試圖調試一些代碼,其中用戶定義的對象的成員神祕改變地址,並同時做我意識到用戶定義的對象做以及。這裏' SA創建它查詢從功能對象地址的小例子,然後從它的成員函數:LOC()的用戶定義的類型給出不同的結果取決於上下文

module foo_module 

    type foo_type 
     contains 
     procedure :: foo 
    end type foo_type 

    contains 

     subroutine foo(this) 
     class(foo_type) :: this 
     print *, 'Inside foo this is', loc(this) 
     end subroutine foo 

    end module foo_module 


    program trial 

    use foo_module 
    type(foo_type) :: object 

    print *, 'Object address', loc(object) 
    call object%foo() 

    end program trial 

示例輸出我得到的是:

Object address   4452052800 
Inside foo this is  140734643354880 

爲什麼我收到了兩個不同的地址同一個對象?難道我做錯了什麼?或者是有什麼與LOC起作用我不知道'?

我'中號下OSX使用ifort。

回答

2

LOC是一個擴展。其行爲如編譯器供應商所指定。

供應商在這裏的行爲不清楚,但你看到的區別是,在主程序中,你得到了非多態對象的內存地址的整數等價物(你可能期望的),而在子例程中,您將獲得該對象的多態描述符的內存地址的整數等價物(可能是您想要的,也許不是)。

使用TRANSFER(C_LOC(xxx),0_C_INTPTR_T)是一種獲取對象地址的整數表示的可移植方式(其中C_ *是來自ISO_C_BINDING內部模塊的地址)。 C_LOC要求它的參數具有TARGET屬性並且是非多態的(使用SELECT TYPE)。

我建議,要求對相關,如果你想上的LOC擴展的預期行爲進一步澄清。

+0

這是一個錯誤 - Ian是正確的,LOC給出函數內描述符的地址。我會讓開發人員知道。 –

0

我已報告的錯誤給開發商我們的內部問題編號爲DPD200253159。我發現ISO_C_BINDING中的C_LOC函數起作用。例如:

subroutine foo(this) 
    use, intrinsic :: iso_c_binding 
    class(foo_type) :: this 
    print *, 'Inside foo this is', transfer(c_loc(this),0_C_INTPTR_T) 
    end subroutine foo 
+0

這將在今年晚些時候發佈的15.0版本中修復。 –

相關問題