如何在C

时间:2016-11-13 14:06:57

标签: c++ visual-c++ fortran fortran-iso-c-binding

我使用VS2013和Intel Visual Fortran,然后从Fortran代码中创建一个dll。 在Fortran子例程中,它有3个参数," fa"传递函数," a"传递数组," b"传递号码。但是当我在VC ++中调用它时,它不起作用。

更新

嗯......上面的节目很混乱,所以我在下面重新编写程序。我创建了一个fortran dll,它可以传递一个数组来对其元素求和并调用一个c函数。

module callctest

use, intrinsic :: iso_c_binding

implicit none
private
public callcfun

contains    

subroutine callcfun(a,b) bind(C,name = "callcfun")
!DEC$ ATTRIBUTES DLLEXPORT :: callcfun 
    implicit none

    real(c_double), dimension(*):: a !receive an array from c
    type(c_funptr), value :: b ! receive a c function 

    real,  parameter::pi=3.14159
    integer :: i
    real :: sum = 0.0

    do i = 1,3          ! sum the array elements
        sum = sum+a(i)
    end do 
    write(*,*) 'total',sum



    return

end subroutine callcfun

end module callctest 

它调用fortran子程序的c代码:

#include "stdafx.h"
#include <iostream>

using namespace std;

extern "C" {

    void callcfun( double[], void(f)(int)); //

}

void sayhello(int a){


    cout << "Hi! fortran " <<a<< endl;
}
int main(){

    double a[] = { 10.0, 50, 3.0 };

    callcfun(a, sayhello(50));

    system("pause");
    return 0;

}

在c程序中,功能&#34; sayhello&#34;打印字&#34;嗨! FORTRAN&#34;和一个整数,我想调用sayhello函数调用&#34; callcfun(数组,函数)&#34;这是由fortran撰写的。

当我调用&#34; callcfun(数组,函数)&#34;在c程序中如果功能 喜欢&#34; sayhello&#34;只打印&#34;嗨! FORTRAN&#34 ;.但我为sayhello函数添加了一个int参数,以便打印出来的字样&#34;嗨! FORTRAN&#34;和一个整数参数。功能&#34; callcfun&#34;没有成功执行。

错误列表:

错误1错误C2664:&#39; void callcfun(double [],void(__ cdecl *)(int))&#39; :无法转换参数2来自&#39; void&#39; to&#39; void(__ cdecl *)(int)&#39; c:\ users \ emlab \ documents \ visual studio 2013 \ projects \ vc ++ \ call_for_ex \ call_for_ex \ call_for_ex.cpp 21 1 call_for_ex

2智能感知:类型的参数&#34; void&#34;与参数不兼容 type&#34; void(*)(int)&#34; c:\ Users \ EMlab \ Documents \ Visual Studio 2013 \ Projects \ VC ++ \ call_for_ex \ call_for_ex \ call_for_ex.cpp 21 14 call_for_ex

错误显示c函数中的问题,如何将c函数传递回fortran dll然后在fortran中调用它?

1 个答案:

答案 0 :(得分:2)

要使Fortran过程可互操作,需要BIND(C)属性。两个Fortran程序都缺少此属性。

对于要从Windows上的DLL导出的过程,必须最终将过程的符号名称提供给链接器。 (有三种方法可以做到这一点:编译器传递给目标代码的源指令(根据与!DEC$ ATTRIBUTES DLLEXPORT过程一起使用的arraysum指令),在模块中列出过程名称定义文件或在链接器命令行上列出/ EXPORT之后的名称 - 我假设后两种方法尚未使用。)鉴于提供一个过程的源指令方法已被用于其中一个过程({{ 1}})要导出,该方法也应该用于需要导出的其他过程(arraysum)。

对于具有C链接的C ++函数,必须使用fcn声明它。 C ++代码中没有extern "C"的声明。 (没有任何fcn声明意味着C ++代码不应该编译。)

当从C ++代码构建exe时,必须将链接器在构建Fortran DLL时生成的导入库(.lib)提供给链接器。通常,这是通过在链接器上提供导入库作为“附加依赖关系”而在Visual Studio中完成的。输入属性页面。