英特尔Visual Fortran中C_INT32_T为负值

时间:2018-02-14 20:03:07

标签: windows fortran intel-fortran fortran-iso-c-binding

尝试在VS2008中使用英特尔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

运行后,将显示以下结果:

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

我可以毫无错误地运行该程序。 如果有人能够确认这个替代方案是正确的或如何解决原始问题,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您的方法适用于英特尔Fortran,但使用SELECTED_INT_KIND(8)代替4会更安全,更便携。

英特尔Visual Fortran显然使用Visual C ++作为配套C编译器。显然这个版本还不支持这些C99类型。 AFAIK Visual C ++比C更倾向于C ++,并且不会过快地带来新的C标准功能。尽管https://msdn.microsoft.com/en-us/library/323b6b3k.aspx

支持最新版本

在我看来,即使C编译器没有定义这些常量,英特尔Fortran仍然可以更有用地定义c_种类值,但也许它不是完全符合标准的。但我认为这将是一个有用的扩展。

答案 1 :(得分:1)

您只需要更新版本的英特尔Fortran。如果您使用的是VS2008,则最多使用版本14;当前版本是18,那里你的测试程序产生结果:

   4           8           4           4           4