Zugriffsverletzung beim Einfügen eines Elements in eine globale Karte

Ich habe versucht, dies jetzt stundenlang ohne Glück zu debuggen. Ich weiß, dass ihr das Problem innerhalb von Minuten lösen werdet, also ist hier die Situation:

Ich habe ~ 400 .cpp / .h-Dateien mit dem Namen ProblemX.cpp / ProblemX.h (wobei X eine Zahl von 1 bis 400 ist). Jede Datei enthält die Lösung für ein mathematisches Problem. Ich möchte, dass sich die Probleme beim Kompilieren mit einem eindeutigen Schlüssel auf einer globalen Karte registrieren (nur ein Int wird funktionieren) und der Wert ein Zeiger auf die Funktion ist, die die mathematische Problemlösung auslöst.

Die globale Zuordnung wird in Dateien mit dem Namen Problem.h / Problem.cpp erstellt und verarbeitet. Beim ersten Versuch, sich in der Karte selbst zu registrieren, wird jedoch die Meldung "Zugriffsverletzung beim Lesen des Speicherorts 0x00000004" angezeigt. Der Code lautet wie folgt:

In den ProblemX.h-Dateien (Problem1 startet die Lösung für dieses Problem):

#ifndef PROBLEM1_H
#define PROBLEM1_H

#include "Problems.h"
#include <string>

std::string problem1();
static int rc1 = registerProblem(1, problem1);

#endif

In der Datei Problems.h (problemFinder ist die Funktion, die die globale Zuordnung verwendet, um den entsprechenden Funktionszeiger aufzurufen):

#ifndef PROBLEMS_H
#define PROBLEMS_H

#include <string>

int registerProblem(int problemNum, std::string (*problemFunc)(void));
std::string problemFinder(int problemNum);

#endif

In Problems.cpp:

#include "Problems.h"
#include <iostream>
#include <map>

using namespace std;

map<int,std::string (*)(void)> problems_map;

int registerProblem(int problemNum, string (*problemFunc)(void)) {
    int rc = 0;
    problems_map[problemNum] = problemFunc;
    return rc;
}


string problemFinder(int problemNum) {
    string retStr = "";
    retStr = problems_map[problemNum]();
    return retStr;
}

Die Zugriffsverletzung tritt auf, wenn "problems_map [problemNum] = problemFunc;".

Vielen Dank!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage