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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Локальные переменные.
AHTOXA
сообщение Jan 20 2015, 18:19
Сообщение #16


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(CrimsonPig @ Jan 20 2015, 22:40) *
void Foo(const void* apData), так ведь ? sm.gif

sm.gif У Сергея void const *, это то же самое.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Jan 20 2015, 18:27
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(AHTOXA @ Jan 20 2015, 18:19) *
sm.gif У Сергея void const *, это то же самое.


Хм, действительно, что-то такого вида записи я не встречал...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 20 2015, 19:05
Сообщение #18


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

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



Цитата(Сергей Борщ @ Jan 20 2015, 23:26) *
А складываете вы их всегда в массив unsigned char? И берете всегда из массива unsigned char? Эта функция по идее считает CRC чего угодно. Вот и передавать ей надо "указатель на что угодно", т.е void const *, а внутри заводите уже временную переменную типа "указатель на байт" и присваивайте ей переданный указатель с явным приведением типа. Это позволит написать
Код
typedef struct { ...... } message_t;

message_t Message = {.....};
Checksum = MessageChecksum(&Message, sizeof(Message));
избежав явного приведения типа (unsigned char const *)&Message в большинстве точек вызова. А это разгружает исходник, делая его более легкочитаемым.

а struct как определить? typedef struct {unsigned char paket[BUF_SIZE]} message_t; ?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 20 2015, 19:25
Сообщение #19


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Jenya7 @ Jan 21 2015, 00:05) *
а struct как определить? typedef struct {unsigned char paket[BUF_SIZE]} message_t; ?

Да как вам надо, так и определите.
Суть в том, что если функция подсчёта crc принимает в качестве аргумента указатель на void, то при передаче любого другого указателя в эту функцию к нему не надо применять приведение типа.
Поясню. Пусть у нас есть две функции подсчёта crc:
Код
uint32_t crc1(const void * buf, size_t size);
uint32_t crc2(const uint8_t * buf, size_t size);

И пусть мы хотим посчитать crc следующих объектов:
Код
int intArray[10];
uint8_t byteBuf[20];
struct config_t
{
  uint32_t serial;
  uint32_t baudrate;
}config;

Так вот. Используя первую функцию, мы можем написать:
Код
crc1(intArray, 10*sizeof(int));
crc1(byteBuf, 20);
crc1(&config, sizeof(config));

Для второй функции нам в двух случаях придётся делать приведение типа:
Код
crc2((const uint8_t *)intArray, 10*sizeof(int));
crc2((const uint8_t *)&config, sizeof(config));


Что касаемо добавления const к неизменяемым параметрам. Это очень полезное правило.
Во-первых, это помогает компилятору в плане оптимизации. (Он имеет право не перечитывать такие объекты после вызова функции)
И, во-вторых, это помогает использующему эту функцию программисту быстрее понять логику работы функции. (И не надо думать об этом программисте, как о каком-то абстрактном человеке (и пусть это будет "его ответственность"). В подавляющем большинстве случаев этим программистом будете выsm.gif )
Пример: void * memcpy (void * destination, const void * source, size_t num);
(Если вы случайно перепутаете параметры, то есть шанс, что компилятор вас поправит).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 20 2015, 21:12
Сообщение #20


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Jan 20 2015, 22:25) *
Используя первую функцию, мы можем написать:
Код
crc1(intArray, 10*sizeof(int));
crc1(byteBuf, 20);
crc1(&config, sizeof(config));

Можем написать проще.
Код
crc1(intArray, sizeof(intArray);
crc1(byteBuf, sizeof(byteBuf);
crc1(&config, sizeof(config);
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 21 2015, 07:10
Сообщение #21


Гуру
******

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



Цитата(Jenya7 @ Jan 20 2015, 21:05) *
а struct как определить? typedef struct {unsigned char paket[BUF_SIZE]} message_t; ?
Нет. Вот почему вы пытаетесь пакет (последовательность байтов) втиснуть внутрь сообщения? Ваше сообщение должно содержать осмысленную информацию, а в нужный момент просто рассматриваться как последобательность байтов:

Код
enum command_t
{
      LOAD,
      SAVE,
      RUN,
      STOP,
      SLAP_NEAREST_INNOCENT_BYSTANDER,
};

__attribute__((__packed__))
typedef struct
{
    uint16_t    Serial_number;
    command_t   Command;
    uint32_t    Data;
} message_t;

void send()
{
     // работаем с осмысленной информацией.
     message_t Message = { 12345, RUN, 54321 };
     Checksum = MessageChecksum(&Message, sizeof(Message));

    {
         // а вот в этом блоке работаем с сообщением как с последовательностью байтов:

         uint8_t const * pPacket = (uint8_t const *)&Message;

         for(uint_fast8_t i = 0; i < sizeof(message_t); ++i)
               UART_send(*pPacket++);

         UART_send(Checksum);
    }
}



--------------------
На любой вопрос даю любой ответ
"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
сообщение Jan 21 2015, 07:24
Сообщение #22


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

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



спасибо. узнал много интересного. только вот Сергей приводит в примере упакованную структуру а в том же документе не рекомендуют работать с упакованными структурами - влияют на скорость.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 21 2015, 07:56
Сообщение #23


Гуру
******

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



Цитата(Jenya7 @ Jan 21 2015, 09:24) *
а в том же документе не рекомендуют работать с упакованными структурами - влияют на скорость.
Любой инструмент надо применять к месту. Понятное дело, что не нужно любую структуру делать упакованной. Тут мы заводим ее для того, чтобы возложить на компилятор рутинную работу заполнения нужных полей в пакете (в котором поля идут подряд). Если вы будете заполнять их вручную - вы получите слабочитаемую простыню исходника и точно такой же, если не больший, код на выходе.


--------------------
На любой вопрос даю любой ответ
"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

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

 


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


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