尝试在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
我可以毫无错误地运行该程序。 如果有人能够确认这个替代方案是正确的或如何解决原始问题,我将不胜感激。
答案 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