私はFortranでメインプログラムを持っています。Visual Studio 2010 で Intel Visual Fortran XE 2011 を使用しています。C++でコーディングされた関数を使用したいと考えています。私が使用している関数は、いくつかの配列 (入力 - メインの fortran プログラムから設定) を取得し、それらを使用して出力配列を形成します (メインの fortran プログラムに返されます)。次の手順を実行しました。
1) Fortran のメイン プログラムとモジュールを使用して Fortran プロジェクトを作成し、それを "スタートアップ プロジェクト" として設定しました。
2)「スタティック ライブラリ」タイプの C++ プロジェクトを作成しました。
$(IFORT_COMPILERvv)\compiler\lib\ia32
3)ここで説明したように追加しました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++ ルーチンに送信するという考えが安全か、または問題のある (避けたほうがよい) 試みであるかを教えてください。