Fortran Coder

查看: 8861|回复: 9
打印 上一主题 下一主题

[混编] C调用Fortran的混编

[复制链接]

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

楼主
发表于 2017-9-30 07:39:20 | 显示全部楼层
你就是用这种混编方式?太老土了,而且没有扩展性。强烈建议你用 ISO_C_binding 进行。

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2017-9-30 08:12:45 | 显示全部楼层
试试标准的 ISO_C_binding 用法:

[Fortran] 纯文本查看 复制代码
module ForLib
  use , intrinsic :: ISO_C_Binding
  implicit none
contains

  subroutine sub_test(ps,ii,pia,oo) Bind(C,Name="sub_test")
    type(C_PTR) , value :: ps , pia
    character(len=512) , pointer :: s
    integer , pointer :: ia(:)
    integer :: ii,oo
    call c_f_pointer( pia , ia , [100] )
    call c_f_pointer( ps , s )
    oo = len(s)+sum(ia)-ii
    write(789,*) s
  end subroutine sub_test

end module ForLib


[C] 纯文本查看 复制代码
#pragma optimize("g",off)

void sub_test(char *, int *, int *, int *);

__declspec(dllexport) void ccf_test(int *oo){
  int ooa = 64;
  char s[512] = "helllo,world";
  int ii = 32;
  int ia[100];    
  for (int i = 0; i < 100; i++){
    ia[i]=3;
  }
  oo = &ooa;
  sub_test(&s, &ii, &ia[0], oo);
  
}

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

板凳
发表于 2017-10-10 08:27:21 | 显示全部楼层
一般来说,定义得足够长就可以了。因为是虚参,所以并不会占用过多内存空间。
其意义就像:“我以为它有512字节,实际上它不到512字节”
由于C语言字符串以 \0 结尾,所以不能直接对 s 进行 // 等操作。如果需要的话,可以对 s 复制一份后进行。

初次之外,C语言也可以把大小传递给fortran,但是这样会多一个参数。
ccf_test( char *p , int n);

subroutine ccf_test( ps , n )
  character(len=n) , pointer :: s
  call c_f_pointer( ps , s )
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-14 12:40

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表