当前位置:  开发笔记 > 编程语言 > 正文

使用C从C++访问公共类内存

如何解决《使用C从C++访问公共类内存》经验,为你挑选了1个好方法。

问候每个人.

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

我已经将问题缩小到我程序的C++和C部分之间的接口.第一部分包括main.ccp和SA.cpp,以及第二部分CFE.c.

名为'SimAnneal'的类在SA.cpp中存在,具有公共向量DensityArray和ElementArray.该计划的顺序如下:

    创建SimAnneal对象'Obj1'并调用函数ObjFunction()

    该函数初始化矢量大小

    使用指向两个向量及其长度的指针调用CFE(...).

    CFE.c通过使用指针直接编辑向量的数据元素

    ObjFunction()使用EnergyArray(和可能的DensityArray)数据.

所有来源的相关脚本如下:

main.cpp中

#include "SA.h" 

int main() 
{   
    SimAnneal Obj1;

    Obj1.ObjFunction();

    return 0;
}

SA.h

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

SA.cpp

#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

我是否通过尝试从程序的C部分访问向量元素来导致非法内存访问?有没有确定的方法允许这个?

任何帮助都会很有帮助.



1> 小智..:

如果你保持在向量的范围内,你正在做的事情似乎没问题.

您可以通过执行您正在执行的操作来处理std :: vector,就像它是C数组一样 - 获取第一个元素的地址.C++标准已经更改为专门允许这种用法.

目前无法找到C++的技术勘误表副本2003,但显然相关部分参考文献是23.2.4,

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有