繁体   English   中英

使用指针从Fortran调用C函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM