当您使用该标签时,您似乎了解 iso_c_binding。研究 Fortran 2003 与 C 的互操作性。阅读标签说明和一些文档,例如http://gcc.gnu.org/onlinedocs/gcc-4.9.0/gfortran/Interoperability-with-C.html。在现代 Fortran 中,后面没有下划线和类似的东西。
Fortran 没有任何无符号类型,您必须使用有符号类型。只要有符号值为正,它就可以工作。如果需要更大的值,请使用更大的整数类型。如果需要,可以transfer()
将低字节转换为 int32。
第三,Fortran 默认使用一些通过引用传递的变体,特别是对于bind(c)
过程(它可能是对副本或其他变体的引用)。您必须使用value
属性按值传递。
uint32_t encode(uint32_t x, uint32_t y)
uint32_t decode(uint32_t dec)
module c_procs
interface
function encode(x, y) bind(C, name="encode")
use iso_c_binding
integer(c_int32_t) :: encode
integer(c_int32_t), value :: x, y
end function
function decode(x, y) bind(C, name="decode")
use iso_c_binding
integer(c_int32_t) :: decode
integer(c_int32_t), value :: dec
end function
end interface
end module
...
use iso_c_binding
use c_procs
integer(c_int32_t) :: cod, i, j
cod = encode(i,j)
最新版本的 GCC 能够检测到我们在链接时优化期间混合了有符号和无符号类型:
rng.f90:173:0: warning: type of 'sub' does not match original declaration [-Wlto-type-mismatch]
ival = sub(jz, jsr)
^
rng_c.c:2:10: note: return value type mismatch
uint32_t sub(uint32_t a, uint32_t b) {
^
/usr/include/stdint.h:51:23: note: type 'uint32_t' should match type 'int'
typedef unsigned int uint32_t;
^
rng_c.c:2:10: note: 'sub' was previously declared here
uint32_t sub(uint32_t a, uint32_t b) {
如果您知道自己在做什么,则可以忽略警告或将其禁用。