Fortran Coder

查看: 12399|回复: 6
打印 上一主题 下一主题

[混编] 从C传递数组到Fortran

[复制链接]

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

跳转到指定楼层
楼主
发表于 2014-3-12 23:06:02 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
问题:
从C传递数组到Fortran,分别通过interface定义了subroutine和function的形式,前者未起作用,而后者却可以
编译器:gcc/gfortran 4.7&4.8
fortran代码:
[Fortran] 纯文本查看 复制代码
module dynamic
use,intrinsic::iso_c_binding
implicit none
interface
	! Method 1: pass array via subroutine
	subroutine dynamic_array(length,a,n)bind(c,name='dynamic_array')
	import
	implicit none
	integer(c_int),intent(in),value::length
	integer(c_int),intent(out)::n
	type(c_ptr),intent(out)::a
	end subroutine
	! Mehtod 2: pass array via funciton
	type(c_ptr) function dynamic_array2(length,n)bind(c,name='d_array')
	import
	implicit none
	integer(c_int),intent(in),value::length
	integer(c_int),intent(out)::n
	end function
end interface
end module
program test
use dynamic
implicit none
real,pointer::array(:)
type(c_ptr)::c_array
real(c_float),allocatable::array2(:)
integer::i,j
! Initialize pointer
nullify(array)
c_array=c_null_ptr

i=10
j=0
! Method 1
! not worked
call dynamic_array(i,c_array,j)

call c_f_pointer(c_array,array,[j])
write(*,'(A)')"Pass by subroutine"
write(*,'(A,i4)')"Len of array:",j
write(*,'(A)')"Array values:"
write(*,*)array
c_array=c_null_ptr
array=>null()

i = 10
j = 0
! Method2
! worked
c_array = dynamic_array2(i,j)
call c_f_pointer(c_array,array,[j])
write(*,'(A)')"Pass by function"
write(*,'(A,i4)')"Len of array:",j
write(*,'(A)')"Array values:"
write(*,*)array
c_array=c_null_ptr
array=>null()

end program 

C代码:
[C] 纯文本查看 复制代码
#include <stdlib.h>
#include <stdio.h>
/* float array printing function */ 
void print_float_array(float *array, int len) 
{ 
    int i;
    for(i=0; i<len; i++) 
        printf("%f | ", array[i]);
    putchar('\n');
}

void dynamic_array(int n1,float *a,int *n2)
{
	int i;
	// allocate array
	a = (float*)malloc(n1*2*sizeof(float));
	// set values of array
	for(i=0;i<n1*2;i++){a[i] = (float)i*i+1.0;}
	//print_float_array(a,n1*2);
	// set length of array
	*n2 = 20;
}

float* d_array(int n1,int *n2)
{
	int i;
	float *a;
	// allocate array
	a = (float*)malloc(n1*2*sizeof(float));
	// set value
	for(i=0;i<n1*2;i++){a[i] = (float)i*i+1.0;}
	//print_float_array(a,n1*2);
	// set len of array
	*n2 = 20;
	return a;
}


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

沙发
 楼主| 发表于 2014-3-13 09:14:54 | 显示全部楼层
chuxf 发表于 2014-3-13 00:43
我把 float *a 改成 float **a 以后就可以正常运行了。

因为平时用 Binding 模块少,不太清楚具体如何规定 ...

多谢达人
终于搞明白这个问题了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-14 06:23

Powered by Tencent X3.4

© 2013-2024 Tencent

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