powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / отследить изменение переменной в C.
21 сообщений из 21, страница 1 из 1
отследить изменение переменной в C.
    #39128351
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть пакет с данными uint8_t packet[20] . переменная uint32_t занимает 4 байта. соответственно если я хочу посмотреть изменилась ли переменная в следующей посылке я делаю так

if (new_packet[0] != old_packet[0] || new_packet[1] != old_packet[1] || new_packet[2] != old_packet[2] || new_packet[3] != old_packet[3])

вопрос есть ли более быстрый алгоритм проверки изменения переменной.
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128374
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

memcmp() ?
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128376
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более короткий
Код: sql
1.
if(memcmp(new_packet, old_packet, 4) != 0)
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128380
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TБолее короткий
Код: sql
1.
if(memcmp(new_packet, old_packet, 4) != 0)



ну там тоже перебором сравнивается. побайтно.
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128387
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почетыребайтно
Код: sql
1.
if(*((uint32_t*)new_packet) != *((uint32_t*)old_packet))
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128391
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Dima TБолее короткий
Код: sql
1.
if(memcmp(new_packet, old_packet, 4) != 0)



ну там тоже перебором сравнивается. побайтно.

Почему memsmp() быстрее цикла for
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128394
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
jenya7Dima TБолее короткий
Код: sql
1.
if(memcmp(new_packet, old_packet, 4) != 0)




ну там тоже перебором сравнивается. побайтно. http://habrahabr.ru/company/intel/blog/133962/
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128397
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПочетыребайтно
Код: sql
1.
if(*((uint32_t*)new_packet) != *((uint32_t*)old_packet))



:) да. понимаю. но приведение не отменяет закулисные операции. или таки да есть экономия? я почему так озабочен - это эмбедед, к тому же система на батарейке, важен каждый такт.
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128404
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMasterjenya7пропущено...


ну там тоже перебором сравнивается. побайтно.

Почему memsmp() быстрее цикла for

а это не платформозависимо?
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128409
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Dima TПочетыребайтно
Код: sql
1.
if(*((uint32_t*)new_packet) != *((uint32_t*)old_packet))



:) да. понимаю. но приведение не отменяет закулисные операции. или таки да есть экономия?
Закулисные операции (приведение) происходят в момент компиляции. Во время выполнения их нет.

ИМХУ memcmp() примерно в тоже самое превратится после компиляции. Почитай ссылки в сообщениях выше.

jenya7я почему так озабочен - это эмбедед, к тому же система на батарейке, важен каждый такт.
Не на том экономишь.
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128497
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7DarkMasterпропущено...


Почему memsmp() быстрее цикла for

а это не платформозависимо?

Это платформозависимо.
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128565
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне больше нравиться так.
Код: c#
1.
if(*((uint32_t*)new_packet) != *((uint32_t*)old_packet))


соответственно для ворого uint32_t будет так?
Код: c#
1.
if(*((uint32_t*)&new_packet[4]) != *((uint32_t*)&old_packet[4]))
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128578
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7соответственно для ворого uint32_t будет так?
Код: c#
1.
if(*((uint32_t*)&new_packet[4]) != *((uint32_t*)&old_packet[4]))


Да

Для обоих вместе лучше так
Код: sql
1.
if(memcmp(new_packet, old_packet, 8) != 0)
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128582
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо большое.
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39128920
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

мэмкомпарэ будет шустрее работать если сравнений больше 1 раза(потому как писали не дураки, библиотечное и мульён раз оптимизировано со всех сторон). естественно функция из стандартной библиотеки - т.е. будет поставлен оптимизированный код
под ваш мк.

если в рукопашную всё-таки хотите, то задействовать нужно всю ширину регистра данных. т.е. если у вас к примеру stm32(32 разрядный мк), то сравнивать нужно приведя к полному регистру т.е. uint32_t

удачи вам
(круглый)
ЗЫ
Вообще-то это как бы сказать - азы... И Вам следовало бы вкурить альма-матер:
Керниган, Ритчи "Язык программирования С"
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39129465
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0jenya7,

мэмкомпарэ будет шустрее работать если сравнений больше 1 раза(потому как писали не дураки, библиотечное и мульён раз оптимизировано со всех сторон). естественно функция из стандартной библиотеки - т.е. будет поставлен оптимизированный код
под ваш мк.

если в рукопашную всё-таки хотите, то задействовать нужно всю ширину регистра данных. т.е. если у вас к примеру stm32(32 разрядный мк), то сравнивать нужно приведя к полному регистру т.е. uint32_t

удачи вам
(круглый)
ЗЫ
Вообще-то это как бы сказать - азы... И Вам следовало бы вкурить альма-матер:
Керниган, Ритчи "Язык программирования С"

вот листинг
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if(*((uint32_t*)&new_packet[4]) != *((uint32_t*)&old_packet[4]))
1db8:	6878      	ldr	r0, [r7, #4]
1dba:	6873      	ldr	r3, [r6, #4]
1dbc:	4298      	cmp	r0, r3
1dbe:	d010      	beq.n	1de2 <PARSER_ParseBlePacket+0x462>

if(memcmp(&new_packet[4],&old_packet[4],4) != 0)
1a48:	1d3c      	adds	r4, r7, #4
1a4a:	4620      	mov	r0, r4
1a4c:	1d31      	adds	r1, r6, #4
1a4e:	2204      	movs	r2, #4
1a50:	f005 f8f8 	bl	6c44 <memcmp>
1a54:	b160      	cbz	r0, 1a70 <PARSER_ParseBlePacket+0xf0>


который все объясняет.
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39129474
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати я тут подумал
такую запись
Код: c#
1.
tempParam.maxFlowRate = (uint32_t)new_packet[0]+((uint32_t)new_packet[1]<<8)+((uint32_t)new_packet[2]<<16)+((uint32_t)new_packet[3]<<24);


можно заменить на
Код: c#
1.
tempParam.maxFlowRate = *((uint32_t*)&new_packet[0]);


или я не прав?
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39129668
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7или я не прав?
Прав если порядок байт совпадает (endian).

Затести, можно если
Код: sql
1.
*((uint32_t*)&new_packet[0]) == (uint32_t)new_packet[0]+((uint32_t)new_packet[1]<<8)+((uint32_t)new_packet[2]<<16)+((uint32_t)new_packet[3]<<24)
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39129762
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7или я не прав?
Прав если порядок байт совпадает (endian).

Затести, можно если
Код: sql
1.
*((uint32_t*)&new_packet[0]) == (uint32_t)new_packet[0]+((uint32_t)new_packet[1]<<8)+((uint32_t)new_packet[2]<<16)+((uint32_t)new_packet[3]<<24)


да. "индианность" нужно соблюсти. спасибо.
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39133673
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hmidahвсе чт о связано с автоматизацией...

о! ышо живы? молодцы....

поставщики одни из первых сертифицированных компьютерных касс(IPC) в торговлю... всего 4 POS кассы были разрешены = ABS, IPC, NCR и счёт маш. потом халява закончилась - для сертификации кассы нужно было иметь продажи на территории РФ... а для продаж - нужно было иметь сертификацию ... в сертификационную комиссию входили те люди, кто сам имел сертификаты на ввоз указанных брэндов(Ярошевская, Ильин и т.д..) и конкурентов за красивые глазки не пускали..

история ужо. сервис плюс, автобанк, юнион кард, юнион софт сервис
...
Рейтинг: 0 / 0
отследить изменение переменной в C.
    #39133782
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0,

это спамеры. Пару постов слегка не в тему, потом посты с ссылками на оплаченный к раскрутке ресурс.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / отследить изменение переменной в C.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]