私は既にCを追加しようとしている既存のFortranソースコードを持っていますが、CからFortran関数に配列を渡して別の配列を戻すことができません。CからFortran関数を返す配列を呼び出す
それがエラーなしでコンパイルが、私は、コードを実行しようとすると、それがいることを言う:
(Fortranの関数の中で)「次元配列のP2 『』の範囲3の代わりに、-4537421815(またはいくつかの他のを持っています同様の番号)」
私はここで何が起こっているのか分かりません。私は以下の2つのコードを添付します。
NOTE:私は問題を見つけるのに不必要と思われる余分な変数初期化行を削除しました。
C関数:
#include <stdio.h>
#include <stdlib.h>
extern "C" double* __multiphase_tools_MOD_project(double p1[],double *mydt,int *myi,int *myj,int *myk);
extern "C" void cuda_(int *ptr_band, double *ptr_u, double *ptr_v, double *ptr_w)
{
double *pt_out;
double pt_in[3];
// Loop over the domain and compute fluxes near interfaces
//=======================================================================================
// X FACE
//=======================================================================================
for (k = kmin; k <= kmax; k++)
{
for (j = jmin; j <= jmax; j++)
{
for (i = imin; i <= imax; i++)
{
if (abs(band[i-1][j][k]) <= nband_CFL && abs(band[i][j][k]) <= nband_CFL)
{
for (int n = 1; n < 10; n++)
{
pt_in[0] = pt[0][n][1]; pt_in[1] = pt[1][n][1]; pt_in[2] = pt[2][n][1];
pt_out = __multiphase_tools_MOD_project(pt_in,&neg_dt_uvw,&i,&j,&k);
}
}
}
}
}
return;
}
Fortranの機能:
function project(p1,mydt,myi,myj,myk) result(p2)
use math
use iso_c_binding
implicit none
real(WP), dimension(3) :: p2
real(WP), dimension(3), intent(in) :: p1
real(WP), intent(in) :: mydt
integer, intent(in) :: myi,myj,myk
real(WP), dimension(3) :: v1,v2,v3,v4
v1=get_velocity(p1 ,myi,myj,myk)
v2=get_velocity(p1+0.5_WP*mydt*v1,myi,myj,myk)
v3=get_velocity(p1+0.5_WP*mydt*v2,myi,myj,myk)
v4=get_velocity(p1+ mydt*v3,myi,myj,myk)
p2=p1+mydt/6.0_WP*(v1+2.0_WP*v2+2.0_WP*v3+v4)
return
end function project
なぜ、 'bind(c)'をFortranの関数定義に追加して、マニュアル名のマングリングを避けるのでしょうか?これはコールの問題にも対処できます。私はちょうど気づいた:なぜあなたは 'iso_c_binding'を使用していますが、それからエンティティを参照していないのですか?そのモジュールはおそらくあなたが思っていることをしません。 – francescalus
これは、このFortran関数を頻繁に参照する大規模なFortranコードの一部です。私がiso_c_bindingエンティティ(例えばbind(C))をそれに追加すると、すでにうまく機能しているfortran関数によって呼び出されたときに関数が不正になりますか? – LeeVining
'bind(c)'は 'iso_c_binding'エンティティではありません。これは、FortranのC相互運用性機能の全く異なる部分です。しかし、 'bind(c)'自体は、Fortranがどのように機能を見ているかを変えません。 [それは物事を変えるかもしれない議論の相互運用性のような特定の制限を加えます。] – francescalus