我想从Fortran调用一个C api函数。C函数接受一个字节数组:
void image(const void *bitmap, int w, int h);其中,*bitmap中的三个连续字节表示RGB颜色三元组,在C中被解释为unsigned char。我希望在Fortran中初始化位图并在C中绘制当前定义使用
integer*1 rgbImage(6,2)例如,初始化2x2的映像,但编译器不接受赋值
rgbImage(1,1) = 255以获得红色。我看到过使用BYTE,UNSIGNED*1,LOGICAL*1处理无符号单字节的暗示,但gfortran ( Mac下MacPort的gcc 4.4或4.6 )对这两种语言都不太满意。我也许可以通过作弊和赋值-1而不是255来逃脱惩罚,但这使用起来非常不舒服。编译器标志-fno-range-check帮助编译了代码,但可能在其他Fortran编译器中不可用,我认为这是一个丑陋的解决方案(我仍然希望捕获其他警告)。值'FF'X或'11111111'B也被识别为32位整数。
代码在不同Fortran编译器之间的可移植性是非常理想的。
发布于 2012-05-25 22:18:30
我的建议是使用CHARACTER变量,并使用ACHAR设置值(如果需要,使用ICHAR将其转换回整数)。这应该会让你得到你想要的东西,并且是完全可移植的。例如,
character, dimension(6,2) :: rgbImage
rgbImage(1,1) = achar(255)更新为添加:如果您打算使用Fortran2003的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)在其中定义了例程的接口
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发布于 2014-02-13 06:12:53
另一种可能适用于某些情况的策略是将1字节的c整型数组传递给整数(1)数组,例如iVal(:),然后创建另一个整数数组,如Integer(2) iVal2(:),然后:
Where(iVal(:) < 0)
iVal2(:) = -iVal(:)+127
ElseWhere
iVal2(:) = iVal(:)
End Where..。与转换为/fro字符(有时)相比,这可能会更高效/更干净一些,并且(有时)需要更少的代码。
如果你做了很多这样的事情(将各种类型的usigned等连接到Fortran),那么一些依赖Fortran的位内部函数的实用程序可能是值得投资的(例如BTest(),iBSet()等)。
https://stackoverflow.com/questions/10755896
复制相似问题