LOC 和 %LOC 在 Windows 的子例程中不起作用
LOC and %LOC not working in subroutines on Windows
我有一个 Fortran 90 项目,它广泛使用 loc 函数来获取数组的地址(API 的一部分,用于与 Matlab 的互操作性)。
此代码在 Mac 和 Linux 上编译并适用于 Intel 和 gfortran,并且已经有一段时间了(跨几个不同的编译器版本)。
我现在正在尝试使用来自 Composer XE 2015 的 Intel Fortran Windows 进行构建。当我逐步使用调试器时,我看到我的主函数中的 LOC 调用正确 returns 地址,但从中调用的子例程中的调用似乎什么都不做 - 它只是 returns 数据的值而不是位置。
有谁知道为什么 LOC 不起作用?我尝试同时使用 loc() 和 %LOC() 并获得相同的行为。有关示例,请参见 this function。第 69 行的 loc 有效,第 116 行的 loc 无效(只是 returns 数据的值)。 REPIDX_0(X,1) 是一个预处理器宏,在这种情况下只是 returns 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
这是一个编译器错误 - 它已在 15.0.3 中修复。
我有一个 Fortran 90 项目,它广泛使用 loc 函数来获取数组的地址(API 的一部分,用于与 Matlab 的互操作性)。
此代码在 Mac 和 Linux 上编译并适用于 Intel 和 gfortran,并且已经有一段时间了(跨几个不同的编译器版本)。
我现在正在尝试使用来自 Composer XE 2015 的 Intel Fortran Windows 进行构建。当我逐步使用调试器时,我看到我的主函数中的 LOC 调用正确 returns 地址,但从中调用的子例程中的调用似乎什么都不做 - 它只是 returns 数据的值而不是位置。
有谁知道为什么 LOC 不起作用?我尝试同时使用 loc() 和 %LOC() 并获得相同的行为。有关示例,请参见 this function。第 69 行的 loc 有效,第 116 行的 loc 无效(只是 returns 数据的值)。 REPIDX_0(X,1) 是一个预处理器宏,在这种情况下只是 returns 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
这是一个编译器错误 - 它已在 15.0.3 中修复。