问候每个人.
我目前正在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::vectorDensityArray; 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,