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.

17voto

fbrereto Punkte 34770

Der Weg std::map funktioniert, ist, dass es einen Knoten, auf den Sie verweisen wollen, zuweist, wenn er noch nicht existiert. Das heißt, wenn Sie Ihre Submap(s) nicht zuweisen und sie in Ihre Supermap(s) einfügen, erhalten Sie Zeiger auf Speicher, der Ihnen nicht gehört. Wenn Sie dann versuchen, in diesen Speicher zu schreiben, werden Sie abstürzen.

Müssen die Karten auf dem Heap zugewiesen werden? Wenn nicht, können Sie den Typ ändern in:

map<int, map<int, map<int, CString> > > batch; // don't forget the spaces

und Ihr Anruf kann sein:

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

13voto

GManNickG Punkte 476445

Erstens, typedef diese Dinge, und es wird viel einfacher:

typedef std::map<int, CString> page_map;
typedef std::map<int, page_map> document_map;
typedef std::map<int, document_map> batch_map;

batch_map batch;

Beachten Sie, dass Sie den Stack fast immer der dynamischen Zuweisung vorziehen sollten. Zweitens: Sie machen zu viel in einer Zeile!

int transNumber = atoi(transnum);
int docNumber = atoi(*docnum); // why is docnum a pointer?

batch[transNumber ][1][docNumber] = page;

Wenn Sie nun eine Fehlersuche durchführen müssen, können Sie diese Werte leicht überprüfen, und es ist einfacher zu erkennen, wo Sie Fehler machen würden.

Ich denke, mit mehr Informationen könnten wir dies viel einfacher gestalten. Ich wüsste nicht, wozu man so etwas brauchen könnte.

11voto

RichieHindle Punkte 256891

Diese Zeile lautet Weg zu komplex.

Sie müssen sie in kleinere Stücke aufteilen und jedes Stück in eine benannte Variable umwandeln.

5voto

crashmstr Punkte 27437

Wenn Sie es erklären:

map<int, map<int, map<int, CString> > > batch;//no asterisks!

sollten Sie in der Lage sein, dies zu tun:

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

2voto

Tim Punkte 19787

Nur zum Spaß: Warum machen Sie nicht eine Sammlung davon?

typedef int transaction_key;
typedef int doc_id;

class Transaction
{
public:

    Transaction(transaction_key key) : m_key(key) {}

    AddPaymentDoc(doc_id, const std::string&);
    AddInvoiceDoc(doc_id, const std::string&);  
    // I'd probably have these methods return a unique ID actually, rather than 
    // create it yourself...  or they can return void and you pass in the doc id.

    // exception handling/other handling for attempting to reference using a bad id
    std::string GetPayment(doc_id);
    std::string GetInvoice(doc_id);

    std::map <doc_id, std::string> GetPayments() {return Payments;}
    std::map <doc_id, std::string> GetInvoices() {return Invoices;}

private:
    transaction_key m_key;
    std::map <doc_id, std::string> Payments;
    std::map <doc_id, std::string> Invoices;    
};

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