реклама на сайте
подробности

 
 
> Работа с массивом.
Jenya7
сообщение Mar 24 2016, 06:41
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть два варианта.
Первый
Код
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;
}

первый вариант более генерик. не привязан к конкретному массиву поэтому легко переносимый. но с точки зрения скорости - тратит ли первый вариант лишние такты на передачу адреса?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Mar 24 2016, 12:56
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Почему тогда не сделать упакованную структуру из опкода и безымянного union-а структур с наборами данных для разных опкодов? Исходник получится более осмысленный и магических чисел в виде индексов массива в нем не будет.
На плюсах я бы предложил базовый класс с опкодом (generic_command) и отнаследованные от него конкретные команды со своими данными.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 24 2016, 13:20
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Mar 24 2016, 17:56) *
Почему тогда не сделать упакованную структуру из опкода и безымянного union-а структур с наборами данных для разных опкодов? Исходник получится более осмысленный и магических чисел в виде индексов массива в нем не будет.
На плюсах я бы предложил базовый класс с опкодом (generic_command) и отнаследованные от него конкретные команды со своими данными.

это не от меня зависит. я работаю с модулем и его API принимают массив uint8_t в качестве аргумента.

Сообщение отредактировал Jenya7 - Mar 24 2016, 13:21
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 24 2016, 13:38
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Jenya7 @ Mar 24 2016, 15:20) *
я работаю с модулем и его API принимают массив uint8_t в качестве аргумента.
Приведите указатель на структуру к указателю на uint8_t перед вызовом функции. Делов-то. Или напишите свою статическую функцию-обертку, в которой делайте это приведение.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 24 2016, 13:59
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Mar 24 2016, 18:38) *
Приведите указатель на структуру к указателю на uint8_t перед вызовом функции. Делов-то. Или напишите свою статическую функцию-обертку, в которой делайте это приведение.

это как? sm.gif

у меня не все данные размером 1 байт. есть 2-4 байта.

Сообщение отредактировал Jenya7 - Mar 24 2016, 14:01
Go to the top of the page
 
+Quote Post
skripach
сообщение Mar 24 2016, 14:13
Сообщение #6


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата(Jenya7)
тратит ли первый вариант лишние такты на передачу адреса?

Выкиньте эти мысли из головы...


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 24 2016, 14:21
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(skripach @ Mar 24 2016, 19:13) *
Выкиньте эти мысли из головы...

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

по моему до меня дошел посыл Сергея.

Код
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;
    };


Сообщение отредактировал Jenya7 - Mar 24 2016, 16:12
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 17:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016