2016-04-27 12 views
1

私はいくつかのプロセス間通信(VS 2015)を行うために、ブーストの共有メモリライブラリを使用しようとしています。私はexample onlineが非常に有用であることを発見しました。正気のために、私は共有メモリアドレスに書き込んだ値が私が望む値であるという簡単なチェックをしたいだけです。これを行うために、私はcoutを使って共有メモリの値を表示したいと思います。これは私が現在持っているコードです:コマンドラインへの共有メモリアドレス値の印刷

#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(); 
} 

コードが正常に動作し、エラーが、それは私が価値あるべきだと思うものを印刷しようとただしたときにマップされたメモリが1に設定されていることを確認したときにスローされていませんアドレスで、私はスマイリーフェイスを取得...

enter image description here

誰もが正しい方向に私を指すことができますか?私はいくつかの疑念を持っています(終了\ 0?)しかし、私は本当にここの内部動作を理解していません。どんな助けもありがとう!

+1

'std :: cout <<"メモリ値: "<<(int)* mem <<" \ n ";' –

+0

完璧な感謝! – willpower2727

答えて

3

のようなものにメモリを設定してみてください、そしてstd::coutは印刷不能であるかに見えることがある(数としてではなく、memに保存されたASCIIコードに対応する文字として出力する値を行っています面白い、後者はあなたの場合です)。

詳細については、cout not printing unsigned charを参照してください。

+0

説明をありがとう! – willpower2727

2

コンソールには、メモリ内のバイトのASCII表現が表示されます。 13未満の文字は通常印刷できません。 67明示的intmemキャスト

+0

あなたは正しく、バイトのASCII repを印刷していました。私は67でテストして、 "C"を印刷しました。 +1しかし、私は1を探していた、私は何を得ようとしていたかを正確に理解していなかった。ありがとう! – willpower2727

+0

Aが65、Bが66なので67 = Cが良い!あなたのコードはうまく動作します:) –

関連する問題