我正在尝试使用 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?这甚至是问题吗?