5 Stimmen

Hilfe bei halb-komplexer C++-Aufgabe

Das ist sicher eine ganz einfache Frage, aber ich wäre für jede Hilfe dankbar :)

Hier ist meine Variable in der .h-Datei:

map<int, map<int, map<int, CString>*>*> batch;

Hier versuche ich, einen Wert zuzuweisen:

((*((*(batch[atoi(transnum)]))[1]))[atoi(*docnum)]) = page;

Ich fügte einige zusätzliche Klammern hinzu, während ich versuchte, dies herauszufinden, um sicherzustellen, dass die Derefs in der richtigen Reihenfolge verarbeitet wurden - leider funktioniert es immer noch nicht. Meine Anwendung stürzt einfach ab, wenn diese Zeile ausgeführt wird. Ich habe sie in ein try {} catch {} eingeschlossen, aber es scheint keine Ausnahme ausgelöst zu werden. Ich verwende C++ nicht sehr oft und frage mich, ob mir jemand sagen kann, was ich falsch mache.

Hier ist die Beziehung, die ich zu modellieren versuche:

Liste der Transaktionsnummern (ganze Zahlen), muss nach Schlüssel geordnet werden.

Für jede Transaktionsnummer habe ich zwei Typen von Dokumenten, Zahlungen und Rechnungen (in meiner obigen Datenstruktur durch 0 bzw. 1 dargestellt)

In jedem Eimertyp kann es Folgendes geben ein oder mehrere Dokumente Diese Dokumente müssen nach ID (docid) geordnet werden.

Jede docid verweist auf eine Zeichenfolge, die aus einer durch Komma getrennten Liste von Dateien im Dateisystem besteht, die verarbeitet werden sollen.

Wenn Sie der Meinung sind, dass es eine bessere Datenstruktur gibt, würde ich das gerne hören.

EDITAR: Ich weiß, dass es viele bessere Möglichkeiten gibt, dies zu tun. Das Szenario war, dass man mir einen Haufen schrecklichen, mit MFC überladenen C++-Code in die Hand drückte und mir sagte, ich solle gestern etwas erledigen. Im Grunde genommen ging es darum, die Datenstruktur dort hineinzubekommen, sie zu laden und sie dann irgendwo anders auszugeben. Ich habe nur versucht, es schnell herauszubekommen, als ich diese Frage stellte. Ich schätze jedoch die Designvorschläge.

1voto

Tyler McHenry Punkte 71707

Sie dereferenzieren wahrscheinlich einen NULL- oder wilden Zeiger an irgendeiner Stelle in diesem Monstrum. Diese Art von Sache wird nicht eine Ausnahme auslösen, es wird nur eine Segmentation Fault (oder Ihre Plattform Äquivalent davon) verursachen.

1voto

CB Bailey Punkte 693084

Wenn ich mir anschaue, was Sie versuchen, in einfache Datenstrukturen zu modellieren, komme ich zu diesem Ergebnis.

std::map ist ein geordneter Container, so dass Sie am Ende die gewünschten Ordnungen erhalten. Indem man die explizite Verwendung von Zeigern vermeidet und es dem Container überlässt, den dynamischen Speicher zu verwalten, ist das Modell einfacher zu verwenden und weniger fehleranfällig.

Wenn Sie das Potenzial für mehr Dokumenttypen als nur Zahlungen und Rechnungen haben, dann würde ich den Dokumenttyp zu einer Aufzählung und die Transaktion zu einer Zuordnung von Dokumenttyp zu DocumentMap .

#include <map>
#include <string>

// Map of docid to comma separated string of files
typedef std::map<int, std::string> DocumentMap;

struct Transaction
{
    DocumentMap payments;
    DocumentMap invoices;
};

// map of transaction id to transaction contents
typedef std::map<int, Transaction> TransactionMap;

TransactionMap batch;

void foo(TransactionMap& batch)
{
    // ...

    batch[transno].invoices[docno] = page;

    // ...
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X