Кто покритикует? Где может потом вылезти проблема, и может ли? Передаю многобайтовые переменные через однобайтовый буфер. send_status_packet(const uip_ip6addr_t *dest_addr, struct simple_udp_connection *connection, uip_ipaddr_t *parent_addr, uint32_t *uptime, int16_t rssi_parent) { uint8_t *uptime_uint8_t = (uint8_t *)uptime; uint8_t *rssi_parent_uint8_t = (uint8_t *)&rssi_parent; uint8_t buf[23]; .... buf[9] = ((uint8_t *)parent_addr)[14]; buf[10] = ((uint8_t *)parent_addr)[15]; buf[11] = *uptime_uint8_t++; buf[12] = *uptime_uint8_t++; buf[13] = *uptime_uint8_t++; buf[14] = *uptime_uint8_t++; buf[15] = *rssi_parent_uint8_t++; buf[16] = *rssi_parent_uint8_t++;
Комментарии: 15
Lexszero
я бы сделал макросы пакующие многобайтные инты с учетом остро/тупоконечности машины если планируется это переносить. чтоб итоговый код в итоге был в духе ptr = buf; ... PUSH_UINT32(ptr, uptime) PUSH_UINT16(ptr, rssi_parent) а еще я не очень понял, зачем ты uptime передаешь указателем.
Dolphin
хотя префиксное только в скобках, автоматом отпадает УБ он его на байты так режет
Vvzvlad
очень надеюсь, что ЭТО не на другой арм переноситься не будет
Lexszero
#define PUSH_UINT32(ptr, x) do { ptr[0] = x & 0xFF; ptr[1] = (x >> 8) & 0xFF; ptr[2] = (x >> 16) && 0xFF; ptr[3] = (x >> 24) && 0xFF; ptr += 4; } while (0) как-то так
Vvzvlad
указатель забыл убрать.
Dmitry
*ptr = x; не?
Dolphin
PUSH_UINT32(ptr, x) do { ptr[0] = x & 0xFF; ptr[1] = (x » 8) & 0xFF; ptr[2] = (x » 16) & 0xFF; ptr[3] = (x » 24) ; ptr += 4; } while (0)
Vvzvlad
из этих сорцов нет, оно платформо-зависимое очень.
Alexey
А зачем делать do {<...>} while(0)?
Lexszero
ptr это пойнтер на однобайт, x четырехбайтный. без кастов будет ой, с кастами - получится вариант оп'а. так делать можно, но не очень кошерно.
Vvzvlad
в общем, с макросами совет хороший, но следовать ему, я конечно не буду. отчасти потому, что такого рода макрос для меня гораздо хуже читаем, чем моя конструкция.
Dmitry
А,лол. А что мешает поинтер сделать на нормальные 32 бита?
Lexszero
ну, например, то что паковать надо кашу из полей разной длины?
Kirill
если си, я бы пиханул мемкопи с инкрементом на sizeof. если плюсы, я бы пиханул вариадик темплейтс вместие с мемкопи и все бы сериализовалось автоматически
Lexszero
а если потребуется какие-нибудь отладочные утилиты для x86 из тех же сорцов/хедеров собрать? по-моему это довольно частый юзкейс