2015-02-07 53 views
2

我有一個Fortran 90項目,它大量使用loc函數來獲取數組的地址(用於與Matlab互操作的API的一部分)。LOC和%LOC在Windows上的子例程中不工作

此代碼在Intel和gfortran上編譯和工作在Mac和Linux上,並且已經有一段時間了(通過幾種不同的編譯器版本)。

我現在正嘗試在Composer XE 2015中使用英特爾Fortran構建Windows。當我使用調試器進行調試時,發現LOC函數正確返回地址,但調用的子例程什麼都不做 - 它只是返回數據的值而不是位置。

有沒有人有一個想法,爲什麼LOC不工作?我嘗試過使用loc()和%LOC()並獲得相同的行爲。有關示例,請參閱this function。 69行上的loc工作,116行上的loc沒有(只返回數據的值)。 REPIDX_0(X,1)是一個預處理宏,在這種情況下只返回X.

任何意見或指針將不勝感激 - 我完全卡住了。

下面是一個小例子:

program testloc 
    implicit none 
    real, pointer :: x 
    integer(8) :: add1, add2 

    allocate(x) 
    x = 2 
    add1 = loc(x) 
    call get_add(x,add2) 
    write(*,*) add1 
    write(*,*) add2 
    deallocate(x) 
contains 
    subroutine get_add(x,add) 
     real, pointer, intent(in) :: x 
     integer(8), intent(out) :: add 
     add = loc(x) 
    end subroutine 
end program 

在Mac/Linux中ifort 12.1.3我得到預期的輸出:

MatlabAPI_lite robince$ ./a.out 
     140661969926608 
     140661969926608 

在Windows與ifort 15.0.1我得到的問題輸出:

c:\code\MatlabAPI_lite>testloc 
     4636400 
       2 
+2

顯示你的代碼,一個例子應該是*在問題本身*(引用從關閉的理由作爲題外話)。 – 2015-02-07 12:31:57

+0

您已在代碼中使用'iso_c_binding'。你爲什麼不使用'type(c_ptr)'和'c_loc()'? – 2015-02-07 12:35:43

+0

嗯,我的問題沒有太多關於我的代碼特別是 - 我已經調試它,並發現問題是LOC返回的值,而不是地址。所以我的問題是如何發生。我不記得幾年前的細節,但是有一些原因c_ptr和c_loc不適合我 - 不要記住它是否缺乏編譯器支持或其他問題。我可以重溫一下,但我希望能夠更容易地獲得現有的基於Windows的代碼(因爲它在mac和linux上已經穩定了很多年) – robince 2015-02-07 16:30:36

回答

2

這是一個編譯器錯誤 - 它在15.0.3中修復。