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