Intel Visual Fortran 中的 C_INT32_T 负值
Value of C_INT32_T negative in Intel Visual Fortran
尝试在 VS2008 中使用带有 Intel Fortran 的 fftw3 库时,我遇到了 iso_c_binding 定义的数据类型的问题。
考虑到 fftw3 在 fftw3.f03 中定义:
integer, parameter :: C_FFTW_R2R_KIND = C_INT32_T
编译代码时使用
行
integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind
我收到以下错误:
error #6684: This is an incorrect value for a kind type parameter in this context. [C_FFTW_R2R_KIND]
为了理解这个问题,我尝试了下面的代码
program test
implicit none
call sub()
contains
subroutine sub()
use, intrinsic :: iso_c_binding
implicit none
write(*,*) C_INT, C_DOUBLE , C_INT32_T, C_INT_FAST32_T, C_INT_LEAST32_T
end subroutine sub
end program test
运行ning后显示如下结果:
4 8 -2 -2 -2
由于 -2 不是有效的数据类型,我认为这是问题所在并查看 https://software.intel.com/en-us/node/678431,我将 fftw3.f03 中的行替换为:
integer, parameter :: C_FFTW_R2R_KIND = 4 !C_INT32_T
而且我可以 运行 程序没有错误。
如果有人能确认这个替代方案是正确的或者如何解决原来的问题,我将不胜感激。
您的方法适用于 Intel Fortran,尽管使用 SELECTED_INT_KIND(8)
而不是 4 会更安全、更便携。
Intel Visual Fortran 显然使用 Visual C++ 作为配套的 C 编译器。显然一个版本还不支持这些 C99 类型。 AFAIK Visual C++ 比 C 更面向 C++,并且不会太快带来新的 C 标准功能。虽然 https://msdn.microsoft.com/en-us/library/323b6b3k.aspx
最近的版本支持它们
在我看来,即使 C 编译器未定义这些常量,英特尔 Fortran 定义 c_
种类值也会更有用,但它可能不完全符合标准。但我认为这将是一个有用的扩展。
您只需要更新版本的 Intel Fortran。如果你使用的是 VS2008,你最多使用版本 14;当前版本是 18,你的测试程序产生结果:
4 8 4 4 4
尝试在 VS2008 中使用带有 Intel Fortran 的 fftw3 库时,我遇到了 iso_c_binding 定义的数据类型的问题。
考虑到 fftw3 在 fftw3.f03 中定义:
integer, parameter :: C_FFTW_R2R_KIND = C_INT32_T
编译代码时使用
行 integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind
我收到以下错误:
error #6684: This is an incorrect value for a kind type parameter in this context. [C_FFTW_R2R_KIND]
为了理解这个问题,我尝试了下面的代码
program test
implicit none
call sub()
contains
subroutine sub()
use, intrinsic :: iso_c_binding
implicit none
write(*,*) C_INT, C_DOUBLE , C_INT32_T, C_INT_FAST32_T, C_INT_LEAST32_T
end subroutine sub
end program test
运行ning后显示如下结果:
4 8 -2 -2 -2
由于 -2 不是有效的数据类型,我认为这是问题所在并查看 https://software.intel.com/en-us/node/678431,我将 fftw3.f03 中的行替换为:
integer, parameter :: C_FFTW_R2R_KIND = 4 !C_INT32_T
而且我可以 运行 程序没有错误。 如果有人能确认这个替代方案是正确的或者如何解决原来的问题,我将不胜感激。
您的方法适用于 Intel Fortran,尽管使用 SELECTED_INT_KIND(8)
而不是 4 会更安全、更便携。
Intel Visual Fortran 显然使用 Visual C++ 作为配套的 C 编译器。显然一个版本还不支持这些 C99 类型。 AFAIK Visual C++ 比 C 更面向 C++,并且不会太快带来新的 C 标准功能。虽然 https://msdn.microsoft.com/en-us/library/323b6b3k.aspx
最近的版本支持它们在我看来,即使 C 编译器未定义这些常量,英特尔 Fortran 定义 c_
种类值也会更有用,但它可能不完全符合标准。但我认为这将是一个有用的扩展。
您只需要更新版本的 Intel Fortran。如果你使用的是 VS2008,你最多使用版本 14;当前版本是 18,你的测试程序产生结果:
4 8 4 4 4