gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:02:41 25 4
gpt4 key购买 nike

我想从 Fortran 调用一个 C api 函数。 C 函数接受一个字节数组:

void image(const void *bitmap, int w, int h);

其中 *bitmap 中的三个连续字节表示一个 RGB 颜色三元组并被解释为 unsigned char在 C 中。我想在 Fortran 中初始化位图并注意在 C 中绘图。Fortran 中的当前定义使用
integer*1 rgbImage(6,2)

例如初始化 2x2 的图像,但编译器不接受赋值
rgbImage(1,1) = 255

得到红色。我看到了使用 BYTE 的提示, UNSIGNED*1 , LOGICAL*1对于无符号单字节,但 gfortran(MacPort 的 gcc 4.4 或 Mac OS X 下的 4.6)对它们中的任何一个都不满意。我可能会通过作弊和分配值(value)来逃脱 -1而不是 255 ,但是使用起来很不舒服。编译器标志 -fno-range-check帮助编译了代码,但在其他 Fortran 编译器中可能不可用,我认为这是一个丑陋的解决方案(我仍然想捕捉其他警告)。值 'FF'X'11111111'B也被识别为 32 位整数。

非常希望代码可以跨不同的 Fortran 编译器移植。

最佳答案

我的建议是使用 CHARACTER变量,并使用 ACHAR设置值(和 ICHAR 必要时转换回整数)。这应该可以让您得到您想要的并且完全便携。例如,

character, dimension(6,2) :: rgbImage

rgbImage(1,1) = achar(255)

更新为添加 :如果你打算使用 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)

您在哪里定义了例程的接口(interface)
 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

关于Fortran:如何将值 255 存储到一个字节中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10755896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com