大家好。
我目前正在UNIX上用C,C++和fortran编写多语言程序,不幸的是,当我尝试在编译后执行时遇到了“段错误”。
我已将问题缩小到程序的C++和C部分之间的接口(interface)。第一部分由main.ccp和SA.cpp组成,第二部分由CFE.c组成。
SA.cpp中存在一个名为“SimAnneal”的类,带有公共(public) vector DensityArray和ElementArray。程序的顺序如下:
以下是所有来源的相关脚本:
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,