|
Логирование данных. |
|
|
|
Jan 17 2017, 09:31
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Мне нужно логировать данные. Вот пишу универсальный логер. Натраиваю куда писать (SD, Flash, UART) и какие данные писать. Я планирую передавать указатель на переменную или структуру которые надо логировать. Но как быть дальше? Данные надо сериализовать (упаковать в массив) для передачи дальше. И тут я застрял. Код void LOG_Send(uint32_t storage, void *data, uint32_t size) { char buf[size]; //size of data??? uint32_t i = 0; while (data) { buf[i++] = (char *)(*data++); } switch (storage) { case SD: SD_Log("log.txt", buf); break; case FLASH: Flash_Log(log_addr, buf); break; case UART: UART_SendString(UART2, buf); break; } } В строке buf[i++] = (char *)(*data++); ругается на приведение типов.
|
|
|
|
|
Jan 17 2017, 09:47
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(novikovfb @ Jan 17 2017, 15:38)  data имеет тип void*, его инкрементировать нельзя (размер указываемой области не определен). Самое простое - скопировать data в обычный указатель на char и не мучиться. понял. сделал так. Код char buf[size]; //size of data??? char *data_p = data; uint32_t i = 0; while (data) { buf[i++] = (*data_p++); } кстати а если я логирую во флеш и хочу потом вытащить данные - их надо десириализовать? то есть надо где то хранить информацию о днных которые я логировал?
|
|
|
|
|
Jan 17 2017, 10:38
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(Jenya7 @ Jan 17 2017, 11:31)  В строке buf[i++] = (char *)(*data++); ругается на приведение типов. Вы приводите к указателю содержимое data, а не data. Нужно так: buf[i++] = *((char*)data)++;
Сообщение отредактировал aiwa - Jan 17 2017, 10:42
|
|
|
|
|
Jan 17 2017, 10:44
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(Эдди @ Jan 17 2017, 12:41)  Еще проще и быстрее по производительности было бы вызвать memcpy. Хотя, если содержимое data не меняется, то зачем вообще его куда-то копировать? Или data передавать в функции в качестве аргумента.
|
|
|
|
|
Jan 17 2017, 11:08
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Цитата(haker_fox @ Jan 17 2017, 13:51)  TCP/IP пакет - это бинарные данные, а гоняются между всеми возможными платформами. И постоянно вызываются функции вроде htoa и т.п. Но TCP/IP — понятно, там потоки большие. А вот если данных немного, лучше не заморачиваться.
|
|
|
|
|
Jan 17 2017, 12:21
|

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

|
Следующий шаг: CODE template<typename T> void LOG_Send(uint32_t storage, T const & data) { LOG_Send(storage, &data, sizeof(T)); } Позволяет писать в каждой точке вызова LOG_send(storage, my_struct) вместо LOG_send(storage, &my_struct , sizeof(my_struct)) и связанных с этим ошибок. Но противники плюсов будут привычно ныть об "увеличении объема кода и подъедании ограниченных ресурсов".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|