在尝试将VS2008中的FFTW3库与英特尔Fortran一起使用时,我遇到了由ISO C_绑定定义的数据类型问题。
考虑到fftw3.f03中定义了fftw3:

  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

运行后,将显示以下结果:
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

我可以不出错地运行程序。
如果有人能确认这个选择是正确的,或如何解决原来的问题,我将不胜感激。

最佳答案

虽然使用SELECTED_INT_KIND(8)而不是4会更安全、更便于移植,但您的方法对于英特尔Fortran来说效果很好。
英特尔Visual Fortran显然使用Visual C++作为同伴C编译器。很显然,这个版本还不支持这些c99类型。AFIK VisualC++比C更面向C++,并没有带来新的C标准特征太快。虽然https://msdn.microsoft.com/en-us/library/323b6b3k.aspx
在我看来,英特尔Fortran定义c_类值更有用,即使C编译器没有定义这些常量,但可能它并不完全符合标准。但我认为这是一个有用的扩展。

关于windows - 英特尔Visual Fortran中C_INT32_T的值为负,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48795313/

10-10 19:16