jenya7 0 24 марта, 2016 Опубликовано 24 марта, 2016 · Жалоба Есть два варианта. Первый void ParseGeneralParam(uint8_t *data_packet) { data_packet[1] = aaa; data_packet[2] = bbb; data_packet[3] = ccc; } и потом передаем глобальный массив uint8_t glob_arr[20]; ParseGeneralParam(glob_arr); Второй - сразу передаем глобальный массив void ParseGeneralParam(void) { glob_arr[1] = aaa; glob_arr[2] = bbb; glob_arr[3] = ccc; } первый вариант более генерик. не привязан к конкретному массиву поэтому легко переносимый. но с точки зрения скорости - тратит ли первый вариант лишние такты на передачу адреса? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 24 марта, 2016 Опубликовано 24 марта, 2016 · Жалоба с точки зрения скорости - тратит ли первый вариант лишние такты на передачу адреса? Если даже и тратит, то что? Если вызов однократный, может и заинлайнить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 марта, 2016 Опубликовано 24 марта, 2016 · Жалоба Если даже и тратит, то что? Если вызов однократный, может и заинлайнить да. вы правы. спасибо. просто начал со второго варианта, задумался, решил перейти на первый. надо действовать в обратном порядке - сначала задумался потом все остальное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 24 марта, 2016 Опубликовано 24 марта, 2016 · Жалоба Так, замечание по ходу дела - вы в курсе, что в С массивы индексируются начиная с 0? А то вы, судя по примеру кода, их индексируете с 1 :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 марта, 2016 Опубликовано 24 марта, 2016 · Жалоба Так, замечание по ходу дела - вы в курсе, что в С массивы индексируются начиная с 0? А то вы, судя по примеру кода, их индексируете с 1 :rolleyes: у меня в нулевом байте опкод лежит. по нему я знаю что по каким байтам рассовать. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 120 24 марта, 2016 Опубликовано 24 марта, 2016 · Жалоба Почему тогда не сделать упакованную структуру из опкода и безымянного union-а структур с наборами данных для разных опкодов? Исходник получится более осмысленный и магических чисел в виде индексов массива в нем не будет. На плюсах я бы предложил базовый класс с опкодом (generic_command) и отнаследованные от него конкретные команды со своими данными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 марта, 2016 Опубликовано 24 марта, 2016 (изменено) · Жалоба Почему тогда не сделать упакованную структуру из опкода и безымянного union-а структур с наборами данных для разных опкодов? Исходник получится более осмысленный и магических чисел в виде индексов массива в нем не будет. На плюсах я бы предложил базовый класс с опкодом (generic_command) и отнаследованные от него конкретные команды со своими данными. это не от меня зависит. я работаю с модулем и его API принимают массив uint8_t в качестве аргумента. Изменено 24 марта, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 120 24 марта, 2016 Опубликовано 24 марта, 2016 · Жалоба я работаю с модулем и его API принимают массив uint8_t в качестве аргумента.Приведите указатель на структуру к указателю на uint8_t перед вызовом функции. Делов-то. Или напишите свою статическую функцию-обертку, в которой делайте это приведение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 марта, 2016 Опубликовано 24 марта, 2016 (изменено) · Жалоба Приведите указатель на структуру к указателю на uint8_t перед вызовом функции. Делов-то. Или напишите свою статическую функцию-обертку, в которой делайте это приведение. это как? :) у меня не все данные размером 1 байт. есть 2-4 байта. Изменено 24 марта, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 24 марта, 2016 Опубликовано 24 марта, 2016 · Жалоба тратит ли первый вариант лишние такты на передачу адреса? Выкиньте эти мысли из головы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 марта, 2016 Опубликовано 24 марта, 2016 (изменено) · Жалоба Выкиньте эти мысли из головы... у меня прибор на батарейке. скорость мне очень важна. по моему до меня дошел посыл Сергея. union two_byte { uint16_t b; uint8_t b1; uint8_t b2; }; union four_byte { uint32_t b; uint8_t b1; uint8_t b2; uint8_t b3; uint8_t b4; }; struct sPacket { uint8_t var1; union two_byte var2; union four_byte var3; }; Изменено 24 марта, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 120 24 марта, 2016 Опубликовано 24 марта, 2016 · Жалоба это как? :) у меня не все данные размером 1 байт. есть 2-4 байта. Примерно так: enum opcode { cmd1_name = 0, cmd2_name = 0x57, cmd3_name = 0xFE, }; typedef struct { opcode Opcode; union { struct { uint8_t Param1_name; uint16_t Param2_name; } cmd1_param; struct { uint16_t Param1_name; uint8_t Param2_name; } cmd2_param; struct { uint8_t Param1_name; } cmd3_param; }; } command_t __attribute__((packed)); extern void api_func1(uint8_t * data); void Test() { command_t Commad; Command.Opcode = cmd2_name; Command.cmd2_param.Param1_name = 45678; Command.cmd2_param.Param2_name = 123; api_func1((uint8_t *)&Command); } по моему до меня дошел посыл Сергея.Не совсем, но ход вашей мысли мне уже нравится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 марта, 2016 Опубликовано 24 марта, 2016 · Жалоба большое спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться