我想从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)
| 归档时间: |
|
| 查看次数: |
2669 次 |
| 最近记录: |