1

私はFortranでメインプログラムを持っています。Visual Studio 2010 で Intel Visual Fortran XE 2011 を使用しています。C++でコーディングされた関数を使用したいと考えています。私が使用している関数は、いくつかの配列 (入力 - メインの fortran プログラムから設定) を取得し、それらを使用して出力配列を形成します (メインの fortran プログラムに返されます)。次の手順を実行しました。

1) Fortran のメイン プログラムとモジュールを使用して Fortran プロジェクトを作成し、それを "スタートアップ プロジェクト" として設定しました。

2)「スタティック ライブラリ」タイプの C++ プロジェクトを作成しました。

$(IFORT_COMPILERvv)\compiler\lib\ia323)ここで説明したように追加しましたhttp://software.intel.com/en-us/articles/configuring-visual-studio-for-mixed-language-applications

C++ スタティック ライブラリは問題なくビルドされています。real(8)私が得るエラーは、fortran プログラムの変数の宣言に関するものです。

すべての real(8) 宣言に対して次の 2 つのエラーが発生します。つまり、合計で 6 つのエラーが発生します。

エラー #5082: 構文エラー、次のいずれかを期待しているときに '(' が見つかりました: :: %FILL 、TYPE BYTE CHARACTER CLASS DOUBLE DOUBLECOMPLEX DOUBLEPRECISION ...

エラー #5082: 構文エラー、次のいずれかを期待しているときに '::' が見つかりました: ( * , ; [ / = =>

使用したコードは次のとおりです。

主な Fortran プログラム:

Program Fort_call_C

use iso_c_binding

implicit none

interface 

   subroutine vec_sum_c(a,b,c) bind (C, name = "vec_sum_c")

      use iso_c_binding

      implicit none

      real(8) (c_double), intent (in), dimension (*) :: a,b
      real(8) (c_double), intent (out), dimension (*) :: c

   end subroutine get_filled_ar

end interface  

integer:: i
integer (c_int)::m
real(8)(c_double),dimension(:):: a, b, c

open(unit=10, file="input_arrays.txt",status="unknown")
read(10,*) m
allocate(a(m),b(m),c(m))

do i=1,m
   read(10,*)a(i),b(i)
end do
close(10)

call vec_sum_c(m,a,b,c)

do i=1,m
   print*, c(i)
end do

pause

end program

C++ 関数は次のとおりです。

extern"C" void vec_sum_c(int *m, double *a, double *b, double *c){
    int mm = *m;
    for(int i=0;i<=m-1;i++){
        c[i]=a[i]+b[i];
     }
}

誰でもこの問題で私を助けてもらえますか? また、配列全体を Fortran プログラムから C++ ルーチンに送信するという考えが安全か、または問題のある (避けたほうがよい) 試みであるかを教えてください。

4

2 に答える 2

0

C関数からfortran関数に変数の値を渡すことしかできませんでした。

main.c と fortran.f という 2 つのソース ファイルをここに貼り付けました。これら 2 つのファイルは、Microsoft Visual Studio 10 で使用できます。ページhttp://software.intel.com/で提案されているように、Visual Studio ですべての設定を行った後en-us/articles/configuring-visual-studio-for-mixed-language-applicationsの場合、次のように別の変更を加える必要があります。

  1. C/C++ スタティック ライブラリのプロジェクト プロパティに移動します。
  2. C/C++ に移動
  3. コード生成に移動
  4. ランタイム ライブラリをマルチスレッド デバッグ (/MTd) に設定します。

これでプログラムをビルドできます....

main.c:

#include <stdio.h>
#include <malloc.h>

void testc(double **pa, double **p)
{
 double b;
 double *a, *c;
 int m;

 c = (double*) malloc(sizeof(double));
 *c = 10;

 *p = c;

 a = (double*) malloc(sizeof(double)*5);
 a[0]=1.23;
  a[1]=2.46;
a[2]=3.69;
 a[3]=4.11;
 a[4]=7.21;
 *pa=a;
 for (m=0;m<5;m++)
 {
    b=a[m];
    b=b+1.0;
    a[m]=b;
  }
 } 

fortran.f:

 program test
  use iso_c_binding
  implicit none
 interface
  subroutine testc(pa, m) bind(c)
  use iso_c_binding
   type(c_ptr):: m
   type(c_ptr):: pa
  end subroutine testc
  end interface

  type(c_ptr) :: pa
  type(c_ptr) :: m
  real(c_double),pointer::fpa(:)
   real(c_double),pointer::fm(:)

    call testc(pa,m)
     call c_f_pointer(pa, fpa, [5])
     call c_f_pointer(m, fm, [1])
     print *, fm(1)
    print*, fpa(1)
   pause

 end program test 
于 2013-07-26T21:01:58.830 に答える