Переменная счетчика, передаваемая макросу msgpack_pack_int (), не увеличивается - PullRequest
0 голосов
/ 16 сентября 2011

У меня очень странная проблема при попытке запустить эту довольно простую C программу , которая использует zmq и msgpack .

С server.c проблем нет, однако в clinet.c:39 это msgpack_pack_int (&mpkg, i); и значение i кажется быть выбранным как 0 и не изменяется на каждой итерации. я попробовал кучу разных вещей (например, сделать указатель на i и, используя это, также пытался разделить его на функцию и т. Д.) и ничто не помогает. Я вижу, что msgpack_pack_int() макрос, но почему он привел бы такое поведение и что может Я делаю, чтобы преодолеть это? Есть ли флаг, который может изменить поведение этого вида макроса (как я вижу, он расширяется до встроенной функции) ... Я пробовал -Werror -Wall, с 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: Установлен msgpack из git repo, и у меня все еще возникает та же проблема.

1 Ответ

0 голосов
/ 17 сентября 2011

Оказывается, что на каждой итерации я делал это:

 msgpack_packer_init (&mpkg, &sbuf, msgpack_sbuffer_write);

это нужно сделать только один раз, и вместо этого это должно быть:

 msgpack_sbuffer_init (&sbuf);

или

 msgpack_sbuffer_clear (&sbuf);

Было довольно логично соединить msg_pack* функции вместе и действительно это было взято из простого примера и проблема действительно с документацией, один дополнительный комментарий помог бы!

Обновление: рабочая версия & версия без memcpy .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...