пытается вызвать фортран подпрограмму в с ++ - PullRequest
2 голосов
/ 22 мая 2019

У меня очень ограниченные знания C ++ и еще меньше знаний по фортрану, в настоящее время я пытаюсь вызвать подпрограмму на фортране из основного языка c ++.Следуя некоторым примерам, я смог придумать следующий код для вызова

subroutine fireballess(ear,ne,parames,ifl,photar,photer)

, вот мой код C ++:

#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace std;

extern "C" void fireballess_( double *fear, int fne,double* fparames, int fifl, double *fphotar, double *fphoter);

int main(int argc, char ** argv)
{
    int ne,ifl;
    double *ear;
    double *parames;

    double *photar;
    double *photer;


    parames = new double[9];

// parames=[4.3,0.23,0.5,0.5,1.5,1.,1000.,2.15,3.]
        parames[0]=4.3;
        parames[1]=0.23;
        parames[2]=0.5;
        parames[3]=0.5;
        parames[4]=1.5;
        parames[5]=1.;
        parames[6]=1000.;
        parames[7]=2.15;
        parames[8]=3.;

ne = 2;

    ear = new double[ne];
 ear[0] = 0.;
 ear[1] = 20.;
 ear[2] = 40.;
 ifl=2;

    photar = new double[ne];
    photer = new double[ne];

    // Call a Fortran subroutine
    //subroutine_sum_(&size,vec,&sum);
    fireballess_(&ear,ne,&parames,ifl,&photar,&photer);

    cout << "Calling a Fortran subroutine" << endl;
    cout << "===============================" << endl;

for (int i=0;i<=ne;i++){
    cout << "ear = " <<ear[i-1]<< " - "<<ear[i] << endl;
    cout << "photar = " << photar[i] << endl;
    cout << "photer = " << photer[i] << endl << endl;
}

    delete[] ear;
    delete[] parames;
    delete[] photar;
    delete[] photer;
}

, однако, когда я пытаюсь скомпилировать, я получаюследующая ошибка:

call_fortran.cpp: In function ‘int main(int, char**)’:
call_fortran.cpp:45:53: error: cannot convert ‘double**’ to ‘double*’ for argument ‘1’ to ‘void fireballess_(double*, int, double*, int, double*, double)’
     fireballess_(&ear,ne,&parames,ifl,&photar,photer);

, которую я не понимаю, поскольку переменная фотера следует по тому же пути переменной фотара, которая вместо этого не дает ошибок.Я надеюсь, что кто-то с лучшим пониманием указателей, чем я, может помочь мне здесь.Спасибо

1 Ответ

1 голос
/ 22 мая 2019

ear имеет тип double*, поэтому &ear имеет тип double**, что не подходит для прототипа функции fortran. Избавление от & s может решить проблему (& parames, & photar и & photer также удваиваются **):

Изменение

fireballess_(&ear,ne,&parames,ifl,&photar,&photer);

до

fireballess_(ear,ne,parames,ifl,photar,photer);

Кажется, что прототип функции fortran void fireballess_(double*, int, double*, int, double*, double). Если это действительно так, то photer все еще нужно изменить на photer[i], где (i - индекс массива, такой как 0, 1, 2 ...).

Если вы действительно хотите понять, что происходит, я предлагаю прочитать хороший учебник по C ++ Pointer.

...