Salutations Tout le monde.Accès à la mémoire de classe publique à partir de C++ en utilisant C
Je suis en train d'écrire un programme multi-langage en C, C++ et fortran sous UNIX, malheureusement je rencontre une erreur de segmentation quand j'essaie de l'exécuter après la compilation.
J'ai réduit le problème à l'interface entre les sections C++ et C de mon programme. La première section se compose de main.ccp et SA.cpp, et la seconde CFE.c.
Une classe appelée 'SimAnneal' existe dans SA.cpp, avec les vecteurs publics DensityArray et ElementArray. L'ordre du programme suit:
Créer SimAnneal objet 'Obj1' et la fonction d'appel ObjFunction()
Cette fonction initialise le vecteur tailles
Appel CFE (...) avec des pointeurs vers les deux vecteurs et leur longueur.
CFE.c édite les éléments de données des vecteurs directement via l'utilisation des pointeurs
ObjFunction() utilise les données EnergyArray (et DensityArray possibles).
Le script est pertinent ci-dessous pour toutes les sources:
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) ... }
}
Suis-je un accès causant la mémoire illégale en essayant d'accéder aux éléments vectoriels de la partie C de mon programme? Y a-t-il un moyen sûr de permettre cela?
Toute aide serait très appréciée.
Pouvez-vous poster le code complet à CFE()? C'est là que votre bug est. –
@Raugnar Eh bien, après tout, nous n'avons jamais résolu votre problème. Est-il possible que vous posiez un exemple petit mais plus complet qui illustre ce qui ne va pas? –