Я пытаюсь использовать код Fortran из приложения C++. В частности, я пытаюсь взаимодействовать с SLATEC drc3jj.f. Однако подпрограмма Fortran возвращает массив, размер которого зависит от параметров, переданных функции.Передача массива C++ в подпрограмму Fortran вызывает появление значений nan в результате
Если размер массива равен 1, тогда массив C++, который я печатаю, содержит соответствующее значение. Однако, если этот размер больше единицы, массив 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
Мясо здесь нет. На самом деле мы называем Fortran подпрограмму из C++ и напечатать результат:
#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
NaNs на самом деле имеют надлежащий знак.
Во всяком случае, есть ли другой (правильный) способ передать массивы C++ в Fortran? Это даже проблема?
похоже, вам нужно передать указатель & coeff. dont документы для модуля fortranlinkage адресуют это? – agentp
@george Я пытался, компилятор говорит: 'test.cpp: 13: 58: error: не может преобразовать 'double **' в 'double *' для аргумента '7''. Когда я пытаюсь передать его как '& coeff [0]', я получаю ту же ошибку, что и раньше. Нет модуля, код, который я написал, - это весь код, который я использую. –
исправить двойной [], чтобы удвоить * в шаблоне. – agentp