Dies ist das erste größere Ding, das ich in C++ schreibe, und ich kann mich nicht ganz dem Problem zuwenden, über das ich gestolpert bin. Ich Strings aus einem Prozess Speicher mit dem folgenden Code-Schnipsel zu lesen:Geparste Zeilen aus gelesenen Textbausteinen aus dem Speicher eines Prozesses löschen
auto entries = std::vector<std::string>();
auto msg_node_addr = reader.readPtr(tab_msg_data_struct +
DATA_STRUCT_NODE_OFFSET);
/*
* Loop through message nodes,
* and retrieve information at given offset.
*/
while (msg_node_addr != 0x0) {
auto msg_content_ptr = reader.readPtr(msg_node_addr +
NODE_CONTENT_PTR_OFFSET);
auto msg_content = reader.readStr(msg_content_ptr, 255);
auto has_timestamp = !msg_content.empty()
&& std::isdigit(msg_content[0])
&& std::isdigit(msg_content[1])
&& msg_content[2] == ':';
if (has_timestamp) {
entries.emplace_back(msg_content);
}
// Advance to next node.
msg_node_addr = reader.readPtr(msg_node_addr +
DATA_STRUCT_NODE_STEP_OFFSET);
}
, die in einer Funktion befindet, die den Vektor von Einträgen zurückgibt. Jeder Eintrag ist in der folgenden Form:
12:31 Loot of a <creature>: <loot>
Ich rufe die Funktion, das aktuelle Stück Nachrichten erhalten, und Abrufen von ihnen benötigte Werten. Jetzt, wenn ich es noch einmal anrufe, wird es immer einige Werte geben, um die ich mich schon gekümmert habe, und neue.
Zum Beispiel wäre dies das Ergebnis nach dem ersten Aufruf sein:
15:30 Loot of a <creature>: <loot>
15:30 Loot of a <creature>: <loot>
15:31 Loot of a <creature>: <loot>
Und das, nach dem zweiten:
15:30 Loot of a <creature>: <loot> <- Old value.
15:30 Loot of a <creature>: <loot> <- Old value.
15:31 Loot of a <creature>: <loot> <- Old value.
15:31 Loot of a <creature>: <loot> <- New one.
15:32 Loot of a <creature>: <loot>
Wie kann ich die bereits analysierte Zeichenfolge zu verwerfen? Vergleichen von Zeitstempeln scheint keine Option zu sein, da sie nicht einmal Sekunden enthalten.
Ich glaube nicht, dass Sie Code genug von den umgebenden Anrufen, Anrufern usw. haben, um die Frage richtig beantworten zu können. Ich würde sagen, machen Sie etwas wie make 'msg_node_addr' statisch oder setzen Sie ein' last_accessed_addr' in 'reader', aber ich weiß nicht genug über den Rest des Codes oder das Design. – user2475059
@ user2475059 'Leser' ist nur eine Wrapper-Klasse um Aufrufe von WinAPI. Ich möchte die Nachricht markieren, wo ich während des letzten Anrufs "abgehoben" habe, und von diesem Punkt an während des nächsten Anrufs beginnen. – adrift
Noch einmal, ich kenne die Struktur des Codes nicht gut genug, aber der Ansatz, den ich mir vorstellen würde, ist, den 'last_accessed_addr' irgendwie zu speichern und erst danach alles zurückzugeben. Selbst dann gibt es viele Möglichkeiten * zu tun * (statische Funktion-Scope-Variable, Klassenmitgliedsvariable, irgendeine Art von Rückgabewert-Verfolgung, Bündelung der Zeichenkette mit ihrer Adresse im Prozess und Berechnung mit einer Hilfsfunktion), also ohne anderen Code, um ein Gefühl dafür zu bekommen, welcher Weg am besten ist, stecke ich hier fest. – user2475059