在python中调用带有指针的fortran/c++耦合会产生分段错误(内核转储)

2024-09-29 22:24:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个耦合的代码(fortran和c++),我现在用python调用它。这个main.exe文件工作正常,但是当我在python中调用耦合版本时,我得到了一个分段错误(core dumped)。我确定了产生问题的代码行,显然是由指针引起的。我的职责是:

void emissionPrimSR(pTSysRac sR)
    {
    /* Emission de nouveaux axes primaires sur le système racinaire */

    pTAxe nouvAxe;
    int numPrim, nbPrimAEmettre;
    r3 vInit, dirInit;
    double angRot,angI;

    //printf("\n EMISSION PRIM SR : postest0=%lf, postest1=%lf,postest2=%lf\n",postest0, postest1, postest2);

    nbPrimAEmettre = calcNouvNbPrim() - sR->nbPrim; /* Nombre de primaires à émettre */

    printf("nombre Adv à emettre  %d \n",nbPrimAEmettre);//---- TO DO SUPPRIME LLab

    for ((numPrim=1); (numPrim<=nbPrimAEmettre); (numPrim++)) /* Pour les nouvelles primaires à émettre */
    {
     printf("Je suis dans emissionPrimSR %3i \n",sR->nbPrim);
     /* Calcul de la direction initiale de l'axe */
     if (sR->nbPrim==0) angI=tireGaussien(0.0,0.1); // émission de la radicule qui a un gravitropisme initial fort
      else angI=tireGaussien(P_angInitMoyVertPrim,P_angInitETVertPrim); // angle par rapport à la verticale
     vInit[0]=sin(angI);
     vInit[1]=0.0;
     vInit[2]=cos(angI);
     angRot=sR->angDep+tireAngRad();
     rotZ(vInit,dirInit,angRot);

     /* Génération de l'axe et intégration dans le système racinaire */

nouvAxe=initialiseAxe(sR->nbAxeForm+1,P_diamMax,sR->origine,dirInit,NULL,NULL,postest0, postest1, postest2);
ajouteAxeSR(sR,nouvAxe);
sR->nbPrim++;
  }



  }

所以,这一行给出了一个分段错误:

    nbPrimAEmettre = calcNouvNbPrim() - sR->nbPrim;

函数calcNouvNbPrim()如下所示:

    int calcNouvNbPrim(void){ 
     /* Calcul du nouveau nombre de primaires */

     int nouvNbPrim;

     // CB TEST printf("\n CALC NOUV NB PRIM - TEMPS = %d\n", temps);

     nouvNbPrim=int (P_vitEmissionPrim*temps);

    if (nouvNbPrim>=P_nbMaxPrim) nouvNbPrim=P_nbMaxPrim;

     return nouvNbPrim;

     }  /* Fonction calcNouvNBPrim */

我做错什么了?你知道吗

运行gdb python时,出现以下错误:

  Program received signal SIGSEGV, Segmentation fault.
  0x00007ffff1f7f2e6 in emissionPrimSR (sR=0x0) at src/ArchiSimple.cpp:1586
  1586    nbPrimAEmettre = calcNouvNbPrim() - sR->nbPrim; /* Nombre de primaires � �mettre */`

解决方案:

<>我必须分离我的函数C++和FORTRAN,并在Python中分别调用它们。f90wrap无法处理ISO\u C\u绑定函数。你知道吗


Tags: 错误deintsrprintfangivinitnumprim

热门问题