我想从Fortran调用一个C api函数.C函数接受一个字节数组:
void image(const void *bitmap, int w, int h);
Run Code Online (Sandbox Code Playgroud)
其中三个连续的字节*bitmap
代表一个RGB颜色tripple,并unsigned char
在C 中解释.我想在Fortran中初始化位图并负责在C.内部绘图.Fortran中的当前定义使用
integer*1 rgbImage(6,2)
Run Code Online (Sandbox Code Playgroud)
例如,初始化2x2的图像,但编译器不接受赋值
rgbImage(1,1) = 255
Run Code Online (Sandbox Code Playgroud)
得到红色.我已经看到了使用的提示BYTE
,UNSIGNED*1
,LOGICAL*1
无符号字节单,但gfortran(MacPort的GCC 4.4或4.6在Mac OS X)不符合任何一方的真的很开心.我可能会因为作弊和分配价值-1
而逃脱255
,但是使用起来非常不舒服.编译器标志-fno-range-check
有助于编译代码,但可能在其他Fortran编译器中不可用,我认为它是一个丑陋的解决方案(我仍然希望捕获其他警告).值'FF'X
或'11111111'B
也被识别为32位整数.
非常希望代码可以跨不同的Fortran编译器移植.
Jon*_*rsi 12
我的建议是使用CHARACTER
变量,并用于ACHAR
设置值(并ICHAR
根据需要转换回整数).这应该可以满足您的需求,并且可以完全移植.例如,
character, dimension(6,2) :: rgbImage
rgbImage(1,1) = achar(255)
Run Code Online (Sandbox Code Playgroud)
更新以添加:如果您要使用Fortran 2003 iso_c_binding的东西来连接C例程(强烈推荐!)那么您也可以制作类型的rgbImage数组字符c_char
,例如
character(kind=c_char), dimension(6,2) :: rgbImage
integer(kind=c_int) :: w, h
...
rgbImage(1,1) = achar(255)
...
call image(rgbImage, w, h)
Run Code Online (Sandbox Code Playgroud)
你在哪里定义了例程的接口
interface
subroutine image(img, w, h) bind(C)
use, intrinsic :: iso_c_binding
implicit none
integer(kind=c_int), intent(in), value :: w, h
character(kind=c_char) :: img(:,:)
end subroutine image
end interface
Run Code Online (Sandbox Code Playgroud)