2016-04-27 18 views
1

drucken Ich versuche, Boost Shared Memory-Bibliothek zu verwenden, um einige Interprozesskommunikation (VS 2015) zu tun. Ich fand eine example online, die sehr hilfreich ist. Aus Gründen der Vernunft möchte ich nur eine einfache Überprüfung durchführen, dass der Wert, den ich in die Adresse des gemeinsamen Speichers geschrieben habe, das ist, was ich wollte. Um dies zu tun, möchte ich den Wert des gemeinsamen Speichers mit Cout drucken. Dies ist der Code Ich habe zur Zeit:Shared Memory-Adresse Wert in die Befehlszeile

#include <boost\interprocess\shared_memory_object.hpp> 
#include <boost\interprocess\mapped_region.hpp> 
#include <iostream> 
#include <stdio.h> 
#include <conio.h> 
#include <cstring> 
#include <cstdlib> 
#include <string> 

int main() 
{ 
    using namespace boost::interprocess; 

    struct shm_remove 
    { 
     shm_remove() { shared_memory_object::remove("MySharedMemory"); } 
     ~shm_remove() { shared_memory_object::remove("MySharedMemory"); } 
    } remover; 

    //Create a shared memory object 
    shared_memory_object shm(create_only, "MySharedMemory", read_write); 

    //Set size to 1 
    shm.truncate(1); 

    //Map the whole shared memory in this process 
    mapped_region region(shm, read_write); 

    //Write all the memory to 1 
    std::memset(region.get_address(), 1, region.get_size()); 

    //Check that memory was initialized to 1 
    char *mem = static_cast<char*>(region.get_address()); 

    for (std::size_t i = 0; i < region.get_size(); ++i) 
    { 
     std::cout << "Memory value: " << *mem << "\n"; 
     if (*mem++ != 1) 
     { 
      return 1; //Error checking memory 
     } 
    } 
    std::cout << "press any key to quit"; 
    _getch(); 
} 

Der Code funktioniert gut, werden keine Fehler ausgelöst, wenn es überprüft, ob der zugeordnete Speicher ist auf 1 jedoch eingestellt worden ist, wenn ich versuche zu drucken, was ich denke, der Wert sein sollte an der Adresse, ich ein smiley-Gesicht bekommen ...

enter image description here

Kann mir jemand in die richtige Richtung? Ich habe einige Verdächtigungen (keine Kündigung \ 0?), Aber ich verstehe wirklich nicht die inneren Abläufe hier. Jede Hilfe wird geschätzt!

+1

Versuchen Sie 'std :: cout <<" Speicherwert: "<< (int) * mem <<" \ n ";' –

+0

perfekt danke! – willpower2727

Antwort

3

Cast mem zu int explizit einstellen, dann std::cout in mem zur Ausgabe gespeichert, um den Wert als eine Zahl, nicht als Brief entsprechend dem ASCII-Code wird (was nicht druckbar sind oder aussehen lustig, letzteres ist dein Fall).

Eine ausführlichere Antwort auf das Problem finden Sie unter cout not printing unsigned char.

+0

Danke für die Erklärung! – willpower2727

2

Die Konsole zeigt Ihnen die ASCII-Darstellung von Bytes im Speicher. Jedes Zeichen unter 13 ist normalerweise nicht druckbar. Versuchen Sie, den Speicher zu so etwas wie 67.

+0

Sie hatten Recht, es war ASCII-Rep der Bytes zu drucken, ich habe mit 67 getestet und es gedruckt "C." +1 Aber ich suchte nach 1, ich wusste nicht genau, was ich zu bekommen versuchte. Vielen Dank! – willpower2727

+0

A ist 65, B ist 66 also 67 = C ist großartig! Dein Code funktioniert gut :) –