Fortran:如何将值255存储到一个字节中?

Moj*_*jca 5 fortran gfortran

我想从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)

  • 替代类型是C_INT8_T(Fortran,ISO_C_Binding)和int8_t(C).即使它没有正式匹配C_INT8_T,也可以"欺骗"并在C端使用uint8_t.另一种可行方法...... (2认同)