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

 
 
 
Reply to this topicStart new topic
> Работа с массивом.
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
MrYuran
сообщение Mar 24 2016, 06:53
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Jenya7 @ Mar 24 2016, 09:41) *
с точки зрения скорости - тратит ли первый вариант лишние такты на передачу адреса?

Если даже и тратит, то что?

Если вызов однократный, может и заинлайнить


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 24 2016, 07:08
Сообщение #3


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

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



Цитата(MrYuran @ Mar 24 2016, 11:53) *
Если даже и тратит, то что?

Если вызов однократный, может и заинлайнить

да. вы правы. спасибо. просто начал со второго варианта, задумался, решил перейти на первый. надо действовать в обратном порядке - сначала задумался потом все остальное.
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 24 2016, 11:56
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Так, замечание по ходу дела - вы в курсе, что в С массивы индексируются начиная с 0? А то вы, судя по примеру кода, их индексируете с 1 rolleyes.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 24 2016, 12:01
Сообщение #5


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

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



Цитата(XVR @ Mar 24 2016, 16:56) *
Так, замечание по ходу дела - вы в курсе, что в С массивы индексируются начиная с 0? А то вы, судя по примеру кода, их индексируете с 1 rolleyes.gif

у меня в нулевом байте опкод лежит. по нему я знаю что по каким байтам рассовать. sm.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 24 2016, 12:56
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #7


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

Группа: Участник
Сообщений: 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
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #9


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

Группа: Участник
Сообщений: 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
Сообщение #10


■ ■ ■ ■
*****

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



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

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


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


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

Группа: Участник
Сообщений: 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
Сергей Борщ
сообщение Mar 24 2016, 16:35
Сообщение #12


Гуру
******

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



Цитата(Jenya7 @ Mar 24 2016, 15:59) *
это как? sm.gif

у меня не все данные размером 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 @ Mar 24 2016, 16:21) *
по моему до меня дошел посыл Сергея.
Не совсем, но ход вашей мысли мне уже нравится.


--------------------
На любой вопрос даю любой ответ
"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, 16:41
Сообщение #13


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

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



большое спасибо.
Go to the top of the page
 
+Quote Post

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

 


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


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