2016-04-14 7 views
0

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.

+0

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

+0

@ 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

+0

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

Antwort

0

Sie könnten versuchen, eine Variable static auto last_msg_node_addr = msg_node_address; zu schaffen, bevor Sie zunächst die while-Schleife und nach der Anweisung auto msg_node_addr = reader.readPtr(tab_msg_data_struct + DATA_STRUCT_NODE_OFFSET); eingeben, dann vor den msg_node_addr = reader.readPtr(msg_node_addr + DATA_STRUCT_NODE_STEP_OFFSET); am Ende der Schleife statt die Linie last_msg_node_addr = msg_node_addr;. Da die Variable statisch ist, sollte sie ihren Wert zwischen Funktionsaufrufen behalten. Sie müssten nur die Funktion ändern, um den Wert last_msg_ptr beim Eingeben der Funktion und vor der Aktualisierung zu überprüfen.

Auch sagte man,

Wie kann ich die bereits analysierte Zeichenfolge zu verwerfen? Vergleichen von Zeitstempeln scheint keine Option zu sein, da sie nicht einmal Sekunden enthalten.

Das würde davon abhängen, wie Sie die Saiten sind speichern, aber ich denke, es müsste ein Teil Ihrer Parsing-Routine sein.

+0

Sie beide hatten die richtigen Ideen, ich habe die Existenz von statischen Variablen völlig vergessen, danke! – adrift

+0

Wenn dies in einer Umgebung mit Threads geschieht (es ist zumindest eine Umgebung mit mehreren Prozessen), dann achten Sie auf Threading-Probleme um statische Variablen herum. Zumindest denke ich, dass es problematisch ist. Ich mache nicht viel Threads. – user2475059

Verwandte Themen