kincajou: (Default)
[personal profile] kincajou
Перестало получаться даже самое элементарное. Что глючит? или это я окончательно сошёл с ума?
Дано: в буфере buffer лежит строка ASCII, содержащая три целых числа (в виде их записи), то есть, например, 6 -236 0
Скармливаю её sscanf (buffer, "%lu %d %d", &n, &I, &Q);
На выходе получаю, что n, I и Q равны соответственно 6, 0 и 0.
Скармливаю другую строчку: 7 0 -251.
Получаю 7, -1 и -251

Такое ощущение, что вот именно второе число считываться упорно не хочет. Что это? Как это?! Всегда работало и вдруг такое...

Мало того, поведение программы ещё и зависит от того, с какими флагами оптимизации её скомпилить! Например, если оптимизацию отключить совсем, тогда ещё и первое число не воспринимается - читается либо 0, либо 65535. Бред какой-то.

Date: 2012-03-20 10:42 pm (UTC)
From: [identity profile] shark-ru.livejournal.com
стопудово, напутано с размерами.
какого типа переменные n, I, Q?

Date: 2012-03-20 10:45 pm (UTC)
From: [identity profile] kincajou.livejournal.com
uint32_t, int16_t, int16_t

Date: 2012-03-21 03:11 am (UTC)
From: [identity profile] mhitar.myopenid.com (from livejournal.com)
А машина 16-разрядная? Все таки %d предполагает указатель на int, а на 32 и 64 разрядных системах int обычно 32-битный, поэтому при считывании третьего числа его старшие биты попадут во вторую переменную. Без оптимизации скорее всего отменяется выравнивание, и старшие биты второго числа попадают в первую переменную, но детали могут зависеть от порядка в котором объявлены переменные.

Date: 2012-03-21 08:30 am (UTC)
From: [identity profile] kincajou.livejournal.com
всегда работало!
машина - большой комп, не мк.

и почему так себя ведёт только второе число (при включённой оптимизации, и только первое - без неё)?

Date: 2012-03-21 04:12 am (UTC)
From: [identity profile] potan.livejournal.com
Тогда понятно. Попробуй %hd.

Date: 2012-03-21 08:29 am (UTC)
From: [identity profile] kincajou.livejournal.com
всегда работало

прим.: неа, %hd не помогло
работает, если оптимизацию включить. И не работает, если не включать. Магея!
Edited Date: 2012-03-21 08:37 am (UTC)

Date: 2012-03-21 02:10 pm (UTC)
From: [identity profile] ping-ving.livejournal.com
Тупорылый int как себя ведёт?

Date: 2012-03-21 05:06 am (UTC)
From: [identity profile] tigerofsiberia.livejournal.com
Мне кажется, формат %lu всё портит, может, просто %d туда воткнуть?

Date: 2012-03-21 08:41 am (UTC)
From: [identity profile] kincajou.livejournal.com
пробовал, ничего не меняется. При выключенной оптимизации получается трэш, при включённой помогла замена %d на %hd (т.е. точное указание длины разбираемых данных). При этом %lu - это тоже точное указание (если я правильно помню, то это означает 32 битное беззнаковое -- именно то, что надо)

December 2016

S M T W T F S
    123
45678910
11121314151617
18192021222324
25 262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 16th, 2025 11:44 pm
Powered by Dreamwidth Studios