artemkad 92 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 5 минут назад, jcxz сказал: Обрабатывая его посимвольно, находим границы (начало и конец) ваших лексем. И, найдя их, считаем хеш от тех символов, которые находятся в границах лексем. Есть поток: "abrakadabrapin:0000in1+10" и есть лексемы "pin:", "in", "+", цифры ну а теперь попробуй сперва найти границы, а потом лексемы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба Ну может вы прекратите уже спорить? Я тему создал не для выяснения отношений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 16 minutes ago, jcxz said: Всё вышеописанное должно быть априори известно любому более-менее опытному программисту, который когда-либо парсил строки, поступающие из UART. Это потоковая, посимвольная обработка. Без всяких буферов, строк и прочей ненужной шелухи. Быстрая. Поколение Большого пальца привыкло, что им ткнут в какую-то волшебную формулу или номер страницы- и у них сразу всё получится. Если бы artemkad потрудился прочитать классические труды, о которых я сказал, то этой темы на форуме вообще не было бы, потому что это всё уже давно расписано и разжёвано у классиков, о чём тут сказали уже два человека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 92 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 4 минуты назад, MementoMori сказал: Ну может вы прекратите уже спорить? Я тему создал не для выяснения отношений. Вообще-то спор как раз в тему - один из рабочих вариантов превратить твою структуру typedef struct { unsigned int TimePosition; unsigned char WORK_STATE; unsigned char POWER_REGULATION_MODE; } tINFO_VAR; tINFO_VAR INFO_VAR; в текст вида "INFO_VAR": { "TimePosition": 12345; "WORK_STATE": 5; "POWER_REGULATION_MODE": 10;}; передать его через канал связи, а на приемном конце после разбора снова собрать его в структуру. 3 минуты назад, tonyk_av сказал: Поколение Большого пальца привыкло, что им ткнут в какую-то волшебную формулу или номер страницы- и у них сразу всё получится. Я так понимаю, ты предпочитаешь вариант "читай что на заборе написано - там все есть". 5 минут назад, tonyk_av сказал: Если бы artemkad потрудился прочитать классические труды, Понимаешь, у меня все больше закрадывается подозрение, что ты сам их не читал, а лишь слышал что у классиков это есть. А то, что у них есть совсем не то что мы тут обсуждаем тебе даже в голову не приходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 14 minutes ago, artemkad said: в текст вида Да зачем в текст? Я ж писал выше: TArray__1<System::Byte> * buffer = new TArray__1<System::Byte>; buffer->set_length(6); (*buffer)[0] = INFO_VAR.POWER_REGULATION_MODE; (*buffer)[1] = INFO_VAR.WORK_STATE; (*buffer)[2] = INFO_VAR.TimePosition & 0xFF; (*buffer)[3] = INFO_VAR.TimePosition >> 8; (*buffer)[4] = 0xEE; (*buffer)[5] = 0x0D; Socket->SendData(*buffer); delete buffer; Буфер с байтами передается без проблем, преобразование в текст не требуется. Разбирать и собирать можно байты. Я бы уже давно всю структуру (она у меня сложнее, тут я сократил ее с целью облегчения восприятия) таким же образом заполнил, но я хочу понять, как это делается проще, через указатели. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 11 апреля, 2023 Опубликовано 11 апреля, 2023 (изменено) · Жалоба 22 minutes ago, artemkad said: Понимаешь, у меня все больше закрадывается подозрение, что ты сам их не читал, а лишь слышал что у классиков это есть. А то, что у них есть совсем не то что мы тут обсуждаем тебе даже в голову не приходит. Если напрячься и открыть оглавление, то можно увидеть вот это: Я знаю, что и где смотреть, потому лет 20-25 назад всё это прочитал и неоднократно реализовывал парсеры. Изменено 11 апреля, 2023 пользователем tonyk_av Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 92 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 6 минут назад, MementoMori сказал: Да зачем в текст? Наглядно, универсально, передавать текст уже умеешь, символы не являющиеся текстом используются для управления потоком. В общем, то что я нарисовал это а-ля JSON https://ru.wikipedia.org/wiki/JSON . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 14 минут назад, MementoMori сказал: но я хочу понять, как это делается проще, через указатели 1) получить указатель на буфер (именно на буфер, а не на ваш объект каласса TArray1<System::Byte>) 2a) memcpy() 2b) явно привести этот указатель на буфер к типу "указатель на tINFO_VAR" и присвоить структуру по приведенному указателю. Не видя описания TArray1 очень трудно что-то посоветовать. По вашим примерам видно, что этот класс переопределяет operator[]. Можно, конечно, воспользоваться им, но есть подозрение, что этот класс предоставляет какой-то более удобный в данном случае способ доступа к буферу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 7 minutes ago, Сергей Борщ said: 1) получить указатель на буфер (именно на буфер, а не на ваш объект каласса TArray1<System::Byte>) 2a) memcpy() 2b) явно привести этот указатель на буфер к типу "указатель на tINFO_VAR" и присвоить структуру по приведенному указателю. Ну дык вот, делал уже tINFO_VAR INFO_VAR; tINFO_VAR * pInfo; pInfo=&INFO_VAR; TArray__1<System::Byte> * buffer = new TArray__1<System::Byte>; buffer->set_length(8); memcpy(buffer,pInfo,sizeof(INFO_VAR); Не ругается при компиляции, но ловит какую-то ошибку при работе приложения во время memcpy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 21 minutes ago, Сергей Борщ said: По вашим примерам видно, что этот класс переопределяет operator[]. Можно, конечно, воспользоваться им, но есть подозрение, что этот класс предоставляет какой-то более удобный в данном случае способ доступа к буферу. ВОТ ОНО!!!!!! Вот те самые золотые слова, которые толкнули меня в правильном направлении!!! Есть у TArray__1<System::Byte> операция, которая превращает этот массив в массив unsigned char ! Вот как надо было обращаться к массиву: buffer->data() memcpy(buffer->data(),pInfo,sizeof(INFO_VAR)); Итак, передача: typedef struct { unsigned int TimePosition; unsigned char WORK_STATE; unsigned char POWER_REGULATION_MODE; }tINFO_VAR; tINFO_VAR INFO_VAR; .................................. INFO_VAR.TimePosition=0xCCDD; INFO_VAR.POWER_REGULATION_MODE=0xAA; INFO_VAR.WORK_STATE=0xBB; tINFO_VAR * pInfo; pInfo=&INFO_VAR; ................... TArray__1<System::Byte> * buffer = new TArray__1<System::Byte>; buffer->set_length(sizeof(INFO_VAR)); memcpy(buffer->data(),pInfo,sizeof(INFO_VAR)); Socket->SendData(*buffer); delete buffer; прием tINFO_VAR * pInfo; ..... pInfo=&INFO_VAR; usart_buf[usart_bit++] = received_byte; // прием последнего байта memcpy(pInfo,usart_buf,sizeof(INFO_VAR)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба On 4/11/2023 at 3:27 PM, MementoMori said: ВОТ ОНО!!!!!! Итак, передача: typedef struct { unsigned int TimePosition; unsigned char WORK_STATE; unsigned char POWER_REGULATION_MODE; }tINFO_VAR; tINFO_VAR INFO_VAR; Теперь почитайте как размещаются объекты в памяти. А если у вас принимающая и передающая платформы будут иметь разную разрядность ? И не только. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 92 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 40 минут назад, tonyk_av сказал: Если напрячься и открыть оглавление, то можно увидеть вот это: Молодец. А теперь открой Вира раздел 5.1, прочитай второе предложение и продолжай его читать до полного понимания сравнивая термин "символ" который есть там и "символ" во входном потоке. Возможно тогда поймешь к чему было вот это: 3 часа назад, artemkad сказал: Мы тут до полноценного синтаксического разбора еще не дошли - ограничились только этапом поиска лексем во входном потоке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 27 minutes ago, dimka76 said: А если у вас принимающая и передающая платформы будут иметь разную разрядность ? И не только. Делается под конкретную платформу. Для себя, если быть точным. Но намек ясен, будут предложения по унификации, с целью платформонезависимости? Где у меня слабое место? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 92 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 10 минут назад, MementoMori сказал: Где у меня слабое место? Из-за отсутствия синхронизации пакетов, после потери хотя-бы одного байта или появления хотя-бы одного лишнего дальше начинает летать чушь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 23 minutes ago, MementoMori said: Где у меня слабое место? Размеры типов. В стандарте на язык Си сказано, что "int" зависит от платформы и выбирается из соображений максимальной производительности, но не меньше short. 25 minutes ago, MementoMori said: будут предложения по унификации, с целью платформонезависимости? Сделай Модбас и не мучайся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться