C++ アプリケーションから Fortran コードを使用しようとしています。具体的には、SLATEC のdrc3jj.fとやり取りしようとしています。ただし、Fortran サブルーチンは、関数に渡されたパラメーターに応じてサイズが異なる配列を返します。
配列のサイズが 1 の場合、出力する C++ 配列には適切な値が含まれています。ただし、このサイズが 1 より大きい場合、C++ 配列には、出力値があるべき場所に NaN が含まれます。
以下は私が使用するコードです。これは、Fortran サブルーチンを C++ アプリケーションにリンクするだけです。
#ifndef FORTRANLINKAGE_H
#define FORTRANLINKAGE_H
extern "C"
{
extern void drc3jj_(double*,double*,double*,double*,double*,
double*,double [],int*,int*);
}
#endif // FORTRANLINKAGE_H
お肉はここまで。実際に C++ から Fortran サブルーチンを呼び出し、出力を出力します。
#include "fortranLinkage.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
void wigner3j(double l2, double l3, double m2, double m3, double coeff [])
{
double l1min,l1max;
int ierr,size(3);
drc3jj_(&l2,&l3,&m2,&m3,&l1min,&l1max,coeff,&size,&ierr);
cout << "Min: " << l1min << "\t Max: " << l1max << "\t Err: " << ierr << endl;
}
int main(int argc, char const *argv[])
{
int l1(atoi(argv[1])),l2(atoi(argv[2])),m2(atoi(argv[3])),m3(atoi(argv[4]));
double coeff [3];
wigner3j(l1,l2,m2,m3,coeff);
for (int i=0;i<3;i++)
{
cout << coeff[i] << endl;
}
return 0;
}
プログラムを で呼び出すと./myProgram 2 8 2 8
、適切に 1/sqrt(21) が出力されます。./myProgram 2 8 2 7
ただし、配列のサイズが実際には 2 であるを試すと、次の結果が得られます。
Min: 9 Max: 10 Err: 0
-nan
-nan
2.08175e-317
NaN は実際には適切な符号を持っています。
とにかく、C++ 配列を Fortran に渡す別の (適切な) 方法はありますか? これも問題ですか?