2011-09-16 271 views
0

我有一个非常奇怪的问题,尝试运行这是使用ZMQmsgpack这个很简单C program计数器变量()`宏不会增加

没有与server.c没有问题的,但是在clinet.c:39有 是这个msgpack_pack_int (&mpkg, i);i的价值似乎 被拾起为0,并在每次迭代不会改变。我 已经尝试了一堆不同的东西(例如,使指针 i并使用它,也试图将它分成一个功能等) 并没有什么似乎帮助。我可以看到msgpack_pack_int()是一个宏,但是为什么它会引入这样的行为和我能做些什么来克服呢?是否有可能改变行为 这种宏观的(因为我看到它扩展到内联函数)... 我试图-Werror -Wall,与gccclang,并没有什么 在警告或者出现一个标志;( *

我试图调试它和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,我仍然有同样的问题。

+0

valgrind也没有太大帮助 - https://gist.github.com/1222962 – errordeveloper

回答

0

事实证明,在每次迭代我这样做:

msgpack_packer_init (&mpkg, &sbuf, msgpack_sbuffer_write); 

一个需要做一次,这应该是有代替:

msgpack_sbuffer_init (&sbuf); 

或:

msgpack_sbuffer_clear (&sbuf); 

将​​函数放在一起确实相当合乎逻辑 这是从simple example和 采取的问题是真的与文档,一个额外的评论会帮助!

更新:working version & version without memcpy