Приветствую Всех.
В настоящее время я пишу многоязычную программу на C, C ++ и fortran в UNIX, к сожалению, я сталкиваюсь с «Ошибка сегментации», когда пытаюсь выполнить после компиляции.
Я сузил проблему до интерфейса между разделами C ++ и C моей программы. Первый раздел состоит из main.ccp и SA.cpp, а второй CFE.c.
В SA.cpp существует класс SimAnneal с открытыми векторами 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<float> DensityArray;
std::vector<float> 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<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 моей программы? Есть ли верный способ разрешить это?
Любая помощь будет очень ценной.