2011-09-16 10 views
0

、私は非常に奇妙な問題がzmqmsgpackを使用しているこの非常に簡単C programを実行しようとしてい増加しません。カウンター変数()`マクロは

しかしclinet.c:39であっserver.cに問題、 はありませんが、このmsgpack_pack_int (&mpkg, i);あるとiの値は0としてピックアップされると、各反復で変更されません ようです。私は (例えば、 iへのポインタを作って、それを関数などに分割しようとしました。) 何も役に立たないようです。私はmsgpack_pack_int()が マクロであることを知ることができますが、なぜそれがこのような振る舞いを導入し、何ができるのですか? 私はそれを克服するのですか? 私はgccclang-Werror -Wallを試しましたが、 は何も警告になりません;(どちらかといえば、これはインライン関数に展開されているので) のマクロを変更する可能性があります。 *

私は、私もこれを試してみました

それと期待通り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 repoからmsgpackをインストールしましたが、私はまだ同じ問題があります。

+0

valgrindもあまり役に立ちません - https://gist.github.com/1222962 – errordeveloper

答えて

0

これは、各反復で、私はこれをやっていたことが判明:

msgpack_sbuffer_init (&sbuf); 

か::

を一度だけ実行する必要があり、これは代わりに、そこにあるべき

msgpack_packer_init (&mpkg, &sbuf, msgpack_sbuffer_write); 

msgpack_sbuffer_clear (&sbuf); 

​​の機能をまとめて実際にはと から取られたの問題は、実際にはドキュメンテーションの1つの追加コメントが役立つでしょう!

更新:working version & version without memcpy

関連する問題