gpt4 book ai didi

使用指针从 Fortran 调用 C 函数

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:49 31 4
gpt4 key购买 nike

我正尝试在 C 中创建一个从 Fortran 调用的函数。要事第一。 fortran 代码是用 f77 编译的,c 是用 gcc 编译的。两者都被编译成 .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]);
}

}

中文

integer memory(4)
call copymemory(z'dead', 4, memory)

DO i = 1,memsize
call printf(memory(i))
END DO

最佳答案

我对你的代码有几点看法。

请提供可编译代码并描述该确切代码的输出!

这包括用于标准 header 的 #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

因此要么将其视为 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

关于使用指针从 Fortran 调用 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41511515/

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