powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Считать лог в С.
20 сообщений из 20, страница 1 из 1
Считать лог в С.
    #39080230
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть массив(память) который заполняется записями. каждая запись 2 байта.
я хочу взять скажем 100 последних записей кусками по 20 байт. как мне это сделать?
Есть START_ADDRESS, LAST_ADDRESS, chunk = 20;
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080240
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит "массив(память)" как конкретно он объявлен?
"хочу взять" что под этим подразумевается?
LAST_ADDRESS это что?

Пиши подробнее. Телепатов тут нет.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080246
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЧто значит "массив(память)" как конкретно он объявлен?
"хочу взять" что под этим подразумевается?
LAST_ADDRESS это что?

Пиши подробнее. Телепатов тут нет.

"массив(память)" - это внешняя память.

Кое что я набросал. Но мне это не нравиться.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
uint32_t chank = 20; 
uint32_t last_log_addr = (logNum * DELTA_SIZE) + START_LOG_ADRESS;
uint32_t packet_size;
uint32_t current_addr = last_log_addr;  

//check if the overflow occurred
while (current_addr > START_LOG_ADRESS)
{
    packet_size = chank;

    uint8_t buf[packet_size];

    LOGGER_Readlog(current_addr,packet_size,buf);

    SendBuf(buf);

    current_addr -= chank; 
}
// send the rest of data ???
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080253
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7"массив(память)" - это внешняя память.
так и скажи - есть файл

chank - лучше писать ch u nk
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080258
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Кое что я набросал. Но мне это не нравиться.
Этот код рабочий?

Если рабочий, то что не нравится?

PS Ну нет тут телепатов.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080261
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7Кое что я набросал. Но мне это не нравиться.
Этот код рабочий?

Если рабочий, то что не нравится?

PS Ну нет тут телепатов.

функции рабочие. сам код запустить пока не могу. ну если только создать какой нибудь массив эмулирующий память. я считываю из внешней памяти посредством микроконтролера. вопрос все ли алгоритмически исполнено правильно.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080263
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя тут возможно зацикливание:
Код: sql
1.
2.
3.
4.
uint32_t current_addr = last_log_addr; 
while (current_addr > START_LOG_ADRESS) {
    current_addr -= chank; 
}


Например при
Код: sql
1.
2.
3.
START_LOG_ADRESS = 0
current_addr = 10
chank = 20


Для типа uint32_t 10-20 = 4млрд. с копейками.

Может лучше использовать знаковый int или int32_t ?
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080265
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

он говорит про микросхему памяти, которая подключена у него к микроконтроллеру по какому-то стандартному интерфейсу вроде SPI или I²C.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080273
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7функции рабочие. сам код запустить пока не могу. ну если только создать какой нибудь массив эмулирующий память. я считываю из внешней памяти посредством микроконтролера. вопрос все ли алгоритмически исполнено правильно.
Про типы я тебе уже написал.
По функциям как минимум надо еще проверять что они успешно выполнились и ошибки обрабатывать. Как это делать - читай документацию на эти функции.

while() можно на for() заменить
Код: sql
1.
2.
3.
for(uint32_t current_addr = (logNum * DELTA_SIZE) + START_LOG_ADRESS; current_addr > START_LOG_ADRESS; current_addr -= chank) {
...
}


Это уже дело вкуса.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080288
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TУ тебя тут возможно зацикливание:
Код: sql
1.
2.
3.
4.
uint32_t current_addr = last_log_addr; 
while (current_addr > START_LOG_ADRESS) {
    current_addr -= chank; 
}


Например при
Код: sql
1.
2.
3.
START_LOG_ADRESS = 0
current_addr = 10
chank = 20


Для типа uint32_t 10-20 = 4млрд. с копейками.

Может лучше использовать знаковый int или int32_t ?

да это верно. переменная должна быть знаковая. а как мне взять остаток который не уложился в последний пакет?
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080309
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7как мне взять остаток который не уложился в последний пакет?
посчитать
Код: sql
1.
2.
3.
4.
5.
6.
7.
if(current_addr - START_LOG_ADRESS > chank) {
 packet_size = chank;
} else {
 packet_size = current_addr - START_LOG_ADRESS;
}
...
current_addr -= packet_size;


Тут опять же надо это учесть не меняет ли LOGGER_Readlog() значение packet_size
SendBuf() как-то должен узнать о размере.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080323
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7как мне взять остаток который не уложился в последний пакет?
посчитать
Код: sql
1.
2.
3.
4.
5.
6.
7.
if(current_addr - START_LOG_ADRESS > chank) {
 packet_size = chank;
} else {
 packet_size = current_addr - START_LOG_ADRESS;
}
...
current_addr -= packet_size;


Тут опять же надо это учесть не меняет ли LOGGER_Readlog() значение packet_size
SendBuf() как-то должен узнать о размере.

спасибо. как раз то что нужно. LOGGER_Readlog() не меняет значений. ну кроме буфера конечно.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080361
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверку ошибок не забудь добавить.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080364
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если мне нужно посчитать сколько пакетов по 20 байт выйдет то мне нужно вставить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
   uint32_t chunk = 20; 
   uint32_t last_log_addr = (logNum * DELTA_SIZE) + START_LOG_ADRESS;
   uint32_t packet_size;
   int32_t current_addr = last_log_addr;  
   uint32_t num_of_packets = 0;
    
    while (current_addr > START_LOG_ADRESS)
    {
      current_addr -= chunk;
      num_of_packets++;
    }

    //check if the overflow occurred
    while (current_addr > START_LOG_ADRESS)
    {
    	if(current_addr - START_LOG_ADRESS >= chunk)
    	    packet_size = chunk;
    	else
    	    packet_size = current_addr -START_LOG_ADRESS;

    	uint8_t buf[packet_size];

    	LOGGER_Read(current_addr,packet_size,buf);

    	SendBuf(buf);

    	current_addr -= chunk; 
    }


досадно. два раза цикл прогонять.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080390
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем два цикла? Вставь num_of_packets++ во второй. Первый не нужен.
Код: sql
1.
2.
3.
4.
5.
6.
    //check if the overflow occurred
    while (current_addr > START_LOG_ADRESS)
    {
        num_of_packets++;
    	if(current_addr - START_LOG_ADRESS >= chunk)
...
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080398
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это
Код: plaintext
1.
2.
3.
4.
  	if(current_addr - START_LOG_ADRESS >= chunk)
    	    packet_size = chunk;
    	else
    	    packet_size = current_addr -START_LOG_ADRESS;

можно писать одной строкой
Код: sql
1.
    	    packet_size = (current_addr - START_LOG_ADRESS >= chunk) ? chunk : (current_addr - START_LOG_ADRESS);
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080407
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЗачем два цикла? Вставь num_of_packets++ во второй. Первый не нужен.
Код: sql
1.
2.
3.
4.
5.
6.
    //check if the overflow occurred
    while (current_addr > START_LOG_ADRESS)
    {
        num_of_packets++;
    	if(current_addr - START_LOG_ADRESS >= chunk)
...



а мне надо знать количество пакетов до посылки.
приемная часть должна знать сколько пакетов принять.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080417
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЭто
Код: plaintext
1.
2.
3.
4.
  	if(current_addr - START_LOG_ADRESS >= chunk)
    	    packet_size = chunk;
    	else
    	    packet_size = current_addr -START_LOG_ADRESS;

можно писать одной строкой
Код: sql
1.
    	    packet_size = (current_addr - START_LOG_ADRESS >= chunk) ? chunk : (current_addr - START_LOG_ADRESS);



спасибо. как то не привык пользоваться тернарной записью. ну надо начинать. что называется почувствуй себя крутым кодером. :)
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080419
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7а мне надо знать количество пакетов до посылки.
приемная часть должна знать сколько пакетов принять.
Тогда посчитай.
Код: plaintext
1.
2.
3.
4.
num_of_packets = (current_addr - START_LOG_ADRESS) / chunk; // количество целых пакетов
if((current_addr - START_LOG_ADRESS) % chunk != 0) { // неровно делится на chunk 
  num_of_packets++; // +1 неполный пакет
}


Циклы тут не нужны.
...
Рейтинг: 0 / 0
Считать лог в С.
    #39080437
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7а мне надо знать количество пакетов до посылки.
приемная часть должна знать сколько пакетов принять.
Тогда посчитай.
Код: plaintext
1.
2.
3.
4.
num_of_packets = (current_addr - START_LOG_ADRESS) / chunk; // количество целых пакетов
if((current_addr - START_LOG_ADRESS) % chunk != 0) { // неровно делится на chunk 
  num_of_packets++; // +1 неполный пакет
}


Циклы тут не нужны.

да. спасибо. так лучше.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Считать лог в С.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]