Je suis très confus par une erreur de compilation. Mon code fonctionnait à fond il y a 4-5 heures; le seul point de contrôle réalisable en cours de route n'a fourni aucun indice (c'est-à-dire que je n'ai pas réussi à faire disparaître l'erreur à une étape intermédiaire). Je ne vois pas comment l'erreur du compilateur pourrait être liée à l'un des changements que j'ai faits.Erreur de compilation C++: ld: symbole (s) introuvable pour la fonction membre référencée à partir de _main
Compiler avec g++ -O3 -o a.out -I /Applications/boost_1_42_0/ Host.cpp Simulation.cpp main.cpp Rdraws.cpp SimPars.cpp
l'erreur suivante apparaît
Undefined symbols:
"Simulation::runTestEpidSim()", referenced from:
_main in ccmcSY5M.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
créer et manipuler des objets dans Simulation
main
. Mes seuls changements au code étaient (1) pour créer une nouvelle fonction membre, Simulation::runTestEpidSim()
, qui est appelée dans main
, et (2) pour écrire de nouvelles fonctions globales de traitement d'entrée/sortie, que j'ai depuis déballé et inséré directement dans main
afin de déboguer ce qui se passe.
Je n'ai pas modifié les fichiers cpp, inclus, les fichiers d'en-tête, les bibliothèques ou les commandes du compilateur.
Je ne suis pas un programmeur professionnel. Comment les pros vont-ils débugger ce genre de problème?
Je ne sais pas la meilleure façon de couper et coller mon code, mais voici un excerpt--
class Simulation
{
public:
Simulation(int trt, int sid, SimPars * spPtr );
~Simulation();
// MEMBER FUNCTION PROTOTYPES
void runDemSim(void);
void runEpidSim(void);
double runTestEpidSim(void);
...
}
int main() {
for (int trt = 0; trt < NUM_TREATMENTS; trt++) {
double treatment = TREATMENTS[ trt ];
....
cout << "Treatment #" << trt + 1 << " of " << NUM_TREATMENTS << ":" << endl;
int matchAttempts = 0;
double prevError = 1.0 + PREV_ERROR_THOLD;
double thisBeta = 0.0;
while (matchAttempts < MAX_MATCH_ATTEMPTS && prevError > PREV_ERROR_THOLD) {
cout << " Attempt #" << matchAttempts + 1;
SimPars thesePars;
SimPars * spPtr = &thesePars;
Simulation thisSim(trt, 1, spPtr);
thisSim.runDemSim();
prevError = thisSim.runTestEpidSim() - TARGET_PREV;
cout << ", error=" << prevError << endl;
if (prevError > PREV_ERROR_THOLD) {
....
return 0;
}
J'avais déjà été exécutais runEpidSim()
sans problème.
Mise à jour Je le code complet pour la mise en œuvre de Simulation::runTestEpidSim()
-I ont aucune idée de la meilleure façon de présenter cela!
double Simulation::runTestEpidSim(void) {
if (allHosts.size() == 0) {
cerr << "No hosts remaining for epidemiological simulation. Cancelling." << endl;
assert(false);
}
cout << " Entering test simulation at t=" << demComplete << "." << endl;
double percentDone = 0.0;
// Initialize host population with infections
demOutputStrobe = t;
epidOutputStrobe = t;
seedInfections();
EventPQ::iterator eventIter = currentEvents.begin();
double nextTimeStep = t + EPID_DELTA_T;
double prevalences[ NUM_TEST_SAMPLES ]; // holds prevalences at strobing periods
for (int p = 0; p < NUM_TEST_SAMPLES; p++) {
prevalences[ p ] = 0.0;
}
double prevYear = DEM_SIM_LENGTH + TEST_EPID_SIM_LENGTH - NUM_TEST_SAMPLES; // first simulation year to start sampling
int prevSamples = 0;
while (t < TEST_EPID_SIM_LENGTH + demComplete)
{
#ifdef DEBUG
cout << "time step = " << t << " (" << allHosts.size() << " hosts; " << currentEvents.size() << " events queued)" << endl;
assert(currentEvents.size()>0);
#endif
// Calculate new infections for every host and add events to stack
#ifdef DEBUG
cout << "Adding infections for this time step: " << endl;
#endif
calcSI();
eventIter = currentEvents.begin();
#ifdef DEBUG
cout << "Executing events off stack (currentEvents.size()=" << currentEvents.size() << "): " << endl;
#endif
while ((*eventIter).time < nextTimeStep) {
while (demOutputStrobe < t) {
writeDemOutput();
demOutputStrobe += STROBE_DEM;
}
while (epidOutputStrobe < t) {
writeEpidOutput();
epidOutputStrobe += STROBE_EPID;
}
if (prevYear < t) {
prevalences[ prevSample ] = calcPrev();
cout << "\tOutputting prevalence sample #" << prevSamples+1 << "; prevalence under 5 is " << prevalences[ prevSample ] << endl;
prevSample++;
}
while (percentDone/100.0 < (t - demComplete)/EPID_SIM_LENGTH ) {
cout << "\t" << percentDone << "% of this test component complete." << endl;
percentDone += PROGRESS_INTERVAL;
}
// Execute events off stack
Event thisEvent = *eventIter;
#ifdef DEBUG
assert(thisEvent.time >= t);
if (thisEvent.time < t) {
cout << "Trying to execute event scheduled for time " << thisEvent.time << ", though sim time is " << t << endl;
assert(thisEvent.time >= t);
}
#endif
t = thisEvent.time;
#ifdef DEBUG
cout << "\tt=" << t << endl;
// cout << "\tAbout to execute event ID " << (*eventIter).eventID << " at time " << (*eventIter).time << " for host ID " << (*eventIter).hostID << endl;
cout << "\tAbout to execute event ID " << thisEvent.eventID << " at time " << thisEvent.time << " for host ID " << thisEvent.hostID << endl;
#endif
executeEvent(thisEvent);
eventCtr++;
currentEvents.erase(eventIter); // Check that if event added to top of currentEvents, will not invalidate itr
eventIter = currentEvents.begin();
#ifdef DEBUG
cout << "\tcurrentEvents.size() after pop is " << currentEvents.size() << endl;
#endif
}
t = nextTimeStep;
nextTimeStep += EPID_DELTA_T;
}
double meanPrev = 0.0;
double sumPrev = 0.0;
int totSamples = 0;
for ( int p = 0; p < NUM_TEST_SAMPLES; p++) {
if (prevalences[ p ] > 0) { // in cae
sumPrev += prevalences[ p ];
totSamples++;
}
}
cout << "Counted " << totSamples << " total prevalence samples." << endl;
meanPrev = sumPrev/(double)totSamples;
return(meanPrev);
}
Où sont les implémentations (ou les corps) des méthodes de Simulation? –