0

zmqmsgpackを使用しているこの非常に単純なCプログラムを実行しようとすると、非常に奇妙な問題が発生します。

に問題はありませんがserver.cclinet.c:39これがmsgpack_pack_int (&mpkg, i);あり、の値は、反復ごとに変化しないiように取得されているようです。0私はさまざまなことを試しましたが(たとえば、ポインターを作成して iそれを使用したり、関数に分割したりするなど)、何も役に立たないようです。それはマクロであることがわかりますmsgpack_pack_int()が、なぜそれがそのような振る舞いを導入するのでしょうか、そしてそれを克服するために何ができるでしょうか?この種のマクロの動作を変更する可能性のあるフラグはありますか(インライン関数に展開されるのがわかります)... -Werror -Wall、with gcc、およびを試しclangましたが、警告も表示されません;(*

私はそれをデバッグしてみてi、期待通りにインクリメントしました。

私もこれを試しました、そしてそれはとにかく同じことをするでしょう:

void pack (msgpack_packer *p, msgpack_sbuffer *b) {

   static volatile int i = 0;

   printf("\ni=%d\n", i);
   msgpack_packer_init (p, b, msgpack_sbuffer_write);
   msgpack_pack_array (p, 2);
   msgpack_pack_int (p, i++);
   msgpack_pack_str (p, "/i/am/a/clinet/");

}

私は違うはずの何かを試したことさえありますが、ここでも運がありません-

int count (void) {
    static int i = 0;
    i += 1; return i;
}

なぜこれが起こるのか誰にも分かりますか?

更新1:また、最適化フラグなしでmsgpack ライブラリ自体を再コンパイルしましたが、動作も変更されませんでした。

アップデート2: gitリポジトリからmsgpackをインストールしても、同じ問題が発生します。

4

1 に答える 1

0

各反復で私はこれを行っていたことがわかります:

 msgpack_packer_init (&mpkg, &sbuf, msgpack_sbuffer_write);

これは1回だけ実行する必要があり、代わりにこれを実行する必要があります。

 msgpack_sbuffer_init (&sbuf);

また:

 msgpack_sbuffer_clear (&sbuf);

msg_pack*関数をまとめるのはかなり論理的でした。実際、それは単純な例から取られたものであり、問​​題は実際にはドキュメントにあります。1つの追加コメントが役立ちます。

更新:動作中のバージョンmemcpyのないバージョン

于 2011-09-17T10:32:13.343 に答える