大家好。

我目前正在UNIX上用C,C++和fortran编写多语言程序,不幸的是,当我尝试在编译后执行时遇到了“段错误”。

我已将问题缩小到程序的C++和C部分之间的接口(interface)。第一部分由main.ccp和SA.cpp组成,第二部分由CFE.c组成。

SA.cpp中存在一个名为“SimAnneal”的类,带有公共(public) vector DensityArray和ElementArray。程序的顺序如下:

  • 创建SimAnneal对象'Obj1'并调用函数ObjFunction()
  • 该函数初始化 vector 大小
  • 使用指向 vector 及其长度的指针调用CFE(...)。
  • CFE.c通过使用指针
  • 直接编辑 vector 的数据元素
  • ObjFunction()使用EnergyArray(以及可能的DensityArray)数据。

  • 以下是所有来源的相关脚本:

    main.cpp
    #include "SA.h"
    
    int main()
    {
        SimAnneal Obj1;
    
        Obj1.ObjFunction();
    
        return 0;
    }
    


    class SimAnneal
    {
        void Initialize ();
        ...
      public
        std::vector<float> DensityArray;
        std::vector<float> EnergyArray;
        double ObjFunction ();
        ...
    }
    

    文件系统
    #include "CFE.h"
    
    void SimAnneal::Initialize ()
    {
        int length = 15;
        EnergyArray.resize(length);
    DensityArray.resize(length);
    }
    
    double SimAnneal::ObjFunction ()
    {
        Initialize ();
    
        CFE(&DensityArray[0], &EnergyArray[0], DensityArray.size());
    
          // sends pointers of both arrays to CFE.c, which will then
          // directly modify the array
    
        double SumStrainEnergy = 0;
    
        for (int i = 0; i < EnergyArray.size(); i++)
        {
            SumStrainEnergy += EnergyArray[i];  //Effectively sum of array
                                                //engy[] from CFE.c
        }
    
        return SumStrainEnergy;
    }
    

    CFE.h
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    void CFE(float density[], float energy[], int NumElem);
    
    #ifdef __cplusplus
     }
    #endif
    

    CFE.c
    void CFE(float density[], float energy[], int NumElem)
    {
        ...
    
        float * dens;
        dens = density;  //pass pointer of array density[0] in SA.cpp to CFE.c
    
        for(n=0; n<NumElem; n++)
        { ... modify dens (e.g. DensityArray from SA.cpp) ... }
    
        float * engy;
        engy = energy; //pass pointer of array energy[0] in SA.cpp to CFE.c
    
        for(n=0; n<NumElem; n++)
        { ... modify engy (e.g. EnergyArray from SA.cpp) ... }
    }
    

    我是否通过尝试从程序的C部分访问 vector 元素而导致了非法的内存访问?有什么确定的方法允许这样做吗?

    任何帮助将不胜枚举。

    最佳答案

    只要您停留在 vector 的范围内,您正在做的事情就可以了。

    通过执行您的操作-取第一个元素的地址,可以将std::vector完全当作C数组对待。 C++标准已更改为专门允许这种用法。

    目前找不到C++技术勘误2003的副本,但显然相关部分的引用文献是23.2.4,

    09-30 15:51
    查看更多