C ++中调用fortran子例程时出现分段错误

道威

我正在尝试在C ++中调用Fortran子例程。

这是子例程的开始:

    subroutine fireballess(ear,ne,parames,ifl,photar,photer)
    integer ne,ifl
    real*4 ear(0:ne),parames(10),photar(ne),photer(ne)

该子例程在Fortran中工作正常,但是当我尝试在C ++中调用它时,出现了段错误。这是我的代码:

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

    using namespace std;

    extern "C" void fireballess_( double *fear, int fne,double* fparames, nt 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[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 = 3;

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

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

    // Check on variables initialization

        for (int i=0;i<=2;i++)    cout << ear[i] <<",";
        cout <<"    "<< ne<<"   ";
        for (int i=0;i<=8;i++)    cout << parames[i] <<",";
        cout <<"    "<< ifl <<" "<< photar[0] <<"   "<< photer[0] << endl;

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

    // call to the subroutine -->segmentation fault
            fireballess_(ear,ne,parames,ifl,photar,photer);

        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;
    }

程序在调用子例程时崩溃。我不太熟悉C ++或Fortran编码,因此我不确定该怎么做。到目前为止,我已经检查了传递给子例程的变量的格式是否正确,看起来是否正确。

预先感谢您的任何帮助

--------- EDIT ------阅读一些注释后,我对代码进行了如下修改,但在调用例程时仍然遇到相同的分段错误错误:

using namespace std;

extern "C" void fireballess_( std::vector<float> fear, int fne,std::vector<float> fparames, int fifl, std::vector<float> fphotar, std::vector<float> fphoter);

int main(int argc, char ** argv)
{
    int ne,ifl;
ifl=2;
ne = 3;
    std::vector<float> parames = {4.3,0.23,0.5,0.5,1.5,1.,1000.,2.15,3.};
std::vector<float> ear={0,20,40};
    std::vector<float> photar;
    std::vector<float> photer;

    cout << "Calling a Fortran subroutine" << endl;
    cout << "===============================" << endl;
        fireballess_(ear,ne,parames,ifl,photar,photer);

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;
}

}
罗格维布

结合注释和其他答案中的各种信息,我想原始代码的最低修改版本可能如下所示:

f90堡

subroutine fireballess(ear, ne, parames, ifl, photar, photer)
    implicit none
    integer ne, ifl
    real*4 ear(0:ne), parames(10), photar(ne), photer(ne)

    print *, "ear     = ", ear
    print *, "ne      = ", ne
    print *, "parames = ", parames
    print *, "ifl     = ", ifl
    print *, "photar  = ", photar
    print *, "photer  = ", photer
    print *
    print *, "sizeof(integer) = ", sizeof(ne)
    print *, "sizeof(real*4)  = ", sizeof(ear(1))
end

main.cpp

#include <iostream>

extern "C"
void fireballess_( float *ear, int *ne, float *parames,
                   int *ifl, float *photar, float *photer );

int main()
{
    std::cout << "sizeof(int)   = " << sizeof(int)   << std::endl;
    std::cout << "sizeof(float) = " << sizeof(float) << std::endl;

    int ne = 3, ifl = 2;

    float *ear = new float[ne + 1] { 0.0f, 20.0f, 40.0f, 60.0f };

    float *parames = new float[10]
        { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f,
          0.6f, 0.7f, 0.8f, 0.9f, 1.0f };

    float *photar = new float[ne] { 1.0f, 2.0f, 3.0f };
    float *photer = new float[ne] { 4.0f, 5.0f, 6.0f };

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

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

在这里,修改后的部分是:(1)real*4在Fortran中通常对应float于C ++;(2)我们需要传递实际参数的地址(尤其是neifl);(3)ear应该具有ne + 1元素,因为它是ear(0:ne)在Fortran端定义的然后,将代码编译为

$ gfortran-8 -c fortsub.f90
$ g++-8 main.cpp fortsub.o -lgfortran

给定(带有GCC8 + MacOS10.13)

sizeof(int)   = 4
sizeof(float) = 4
 ear     =    0.00000000       20.0000000       40.0000000       60.0000000    
 ne      =            3
 parames =   0.100000001      0.200000003      0.300000012      0.400000006      0.500000000      0.600000024      0.699999988      0.800000012      0.899999976       1.00000000    
 ifl     =            2
 photar  =    1.00000000       2.00000000       3.00000000    
 photer  =    4.00000000       5.00000000       6.00000000    

 sizeof(integer) =                     4
 sizeof(real*4)  =                     4

如果使用std::vector,则相应的代码可能如下所示(通过查看有关std::vector...的一些教程

// main2.cpp
#include <iostream>
#include <vector>

extern "C"
void fireballess_( float *ear, int *ne, float *parames,
                   int *ifl, float *photar, float *photer );

using Vecf = std::vector<float>;

int main()
{
    int ne = 3, ifl = 2;

    Vecf ear { 0.0f, 20.0f, 40.0f, 60.0f };

    Vecf parames { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f,
                   0.6f, 0.7f, 0.8f, 0.9f, 1.0f };

    Vecf photar { 1.0f, 2.0f, 3.0f };
    Vecf photer { 4.0f, 5.0f, 6.0f };

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

这似乎给出了相同的结果(通过替换main.cppmain2.cpp)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

试图在C ++中调用fortran子例程

从C#调用FORTRAN子例程

在ruby上调用c函数时出现分段错误

在C ++ 11中调用Lambda从高阶函数返回时出现分段错误

在C中实现链表时出现分段错误

在C中传递char **时出现分段错误

在 C 中创建新文件时出现分段错误

在C中访问共享内存时出现分段错误

扫描文件并计算c中的值时出现分段错误

在TensorFlow中访问张量数据时出现分段错误(C ++)

在c中读取文件时出现分段错误

在 C++ 中实现 Trie 时出现分段错误

使用链表中的指针结构时出现C分段错误

从C ++中的文件加载数据时出现分段错误

尝试克隆函数时出现分段错误(在C中)

在 C 中的结构上使用 qsort 时出现分段错误

从C ++调用FORTRAN子例程会产生非法的参数值

从C ++使用可选参数调用Fortran子例程

创建树时出现分段错误 (C)

从向量擦除时出现C ++分段错误

C - 使用 strlen 时出现分段错误?

写入文件时出现C分段错误

使用Python C API两次调用C函数时出现分段错误

C中是否有类似于Fortran中的子例程的子例程?

从C程序调用x86汇编函数时出现分段错误

调用用 C 编写的 Postgres 函数时出现分段错误,使 Postgres 服务器崩溃

调用 rollingfile_udata_set_logdir 时出现 log4c 分段错误

尝试在C中获取文件扩展名时出现分段错误错误

将 unicode 替换为 C++ 字符串中的空格时出现分段错误错误