我有一個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
顯示你的代碼,一個例子應該是*在問題本身*(引用從關閉的理由作爲題外話)。 – 2015-02-07 12:31:57
您已在代碼中使用'iso_c_binding'。你爲什麼不使用'type(c_ptr)'和'c_loc()'? – 2015-02-07 12:35:43
嗯,我的問題沒有太多關於我的代碼特別是 - 我已經調試它,並發現問題是LOC返回的值,而不是地址。所以我的問題是如何發生。我不記得幾年前的細節,但是有一些原因c_ptr和c_loc不適合我 - 不要記住它是否缺乏編譯器支持或其他問題。我可以重溫一下,但我希望能夠更容易地獲得現有的基於Windows的代碼(因爲它在mac和linux上已經穩定了很多年) – robince 2015-02-07 16:30:36