[英]Calling C function from Fortran with pointers
我试图在C中创建一个从Fortran调用的函数。 首先是第一件事。 使用f77编译fortran代码,使用gcc编译c。 两者都编译成.so库。 c函数将通过fortran指定的地址和大小读取设备上的内存。 我能够看到地址和传递给c的大小,但是我无法在c函数中填充数据并将其返回给fortran。 请参阅下面的相关代码。 我的假设是数据变量的内存分配或指针语法有问题。
C
void copymemory_( uint32_t *addr, int *size, uint8_t *data )
{
int i;
printf("addr %x \n", *addr);
printf("size %i \n", *size);
for ( i = 0; i<*size; i++)
{
*data[i] = i;
printf("memory %i \n",*data[i]);
}
}
Fortran
integer memory(4)
call copymemory(z'dead', 4, memory)
DO i = 1,memsize
call printf(memory(i))
END DO
我对您的代码有几点要点。
请提供可编译的代码并描述该确切代码的输出!
其中包括用于标准标头的#include
,如果您希望人们调试您的代码,请对其进行简化,以使他们不必搜索您省略了哪些行,因为它们对您而言似乎“显而易见”。 只需粘贴所有内容。 从此处复制时,代码应编译!
甚至代码的可执行部分也无法在我的编译器中编译。 我不得不将*data
更改为data
。 确定要复制您的实际代码吗?
cfun.c: In function ‘copymemory_’:
cfun.c:13:9: error: invalid type argument of unary ‘*’ (have ‘int’)
*data[i] = i;
^
cfun.c:14:31: error: invalid type argument of unary ‘*’ (have ‘int’)
printf("memory %i \n",*data[i]);
^
您的Fortran代码包含对某些printf
子例程的调用。 在哪里定义? 它存在于您的实际代码中吗? 我对此表示怀疑。 请始终将完整且可编译的代码复制到StackOverflow。
因此,在解决显而易见的问题后,您当前的代码为:
#include <stdio.h>
#include <stdint.h>
void copymemory_( uint32_t *addr, int *size, uint8_t *data )
{
int i;
printf("addr %x \n", *addr);
printf("size %i \n", *size);
for ( i = 0; i<*size; i++)
{
data[i] = i;
printf("memory %i \n",data[i]);
}
}
implicit none
integer :: memsize = 4
integer memory(4)
integer i
call copymemory(z'dead', 4, memory)
DO i = 1,memsize
print *, (memory(i))
END DO
END
它不会崩溃,但是Fortran中的memory
包含垃圾。 必须这样做,因为它是integer
并且您在C int8_t
其视为int8_t
。
因此,要么将其视为C中四个整数的数组,要么将其逐字节复制,但是您必须传递正确数量的字节才能复制。 根据您的描述,不清楚您打算使用哪一种,因此,我将仅显示一种可能性:
void copymemory_( uint32_t *addr, int *size, uint32_t *data )
输出正确,则:
> gfortran-4.10 -fsanitize=address cfun.c ffun.f90
> ./a.out
addr dead
size 4
memory 0
memory 1
memory 2
memory 3
0
1
2
3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.