Перейти к содержанию
    

Как правильно объявить extern для typedef?

5 минут назад, jcxz сказал:

 Обрабатывая его посимвольно, находим границы (начало и конец) ваших лексем. И, найдя их, считаем хеш от тех символов, которые находятся в границах лексем.

Есть поток:

 

"abrakadabrapin:0000in1+10"

и есть лексемы 

"pin:", "in", "+", цифры

ну а теперь попробуй сперва найти границы, а потом лексемы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну может вы прекратите уже спорить? Я тему создал не для выяснения отношений.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, jcxz said:

Всё вышеописанное должно быть априори известно любому более-менее опытному программисту, который когда-либо парсил строки, поступающие из UART.

Это потоковая, посимвольная обработка. Без всяких буферов, строк и прочей ненужной шелухи. Быстрая.

Поколение Большого пальца привыкло, что им ткнут в какую-то волшебную формулу или номер страницы- и у них сразу всё получится. Если бы artemkad потрудился прочитать классические труды, о которых я сказал, то этой темы на форуме вообще не было бы, потому что это всё уже давно расписано и разжёвано у классиков, о чём тут сказали уже два человека. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 потрудился прочитать классические труды,

Понимаешь, у меня все больше закрадывается подозрение, что ты сам их не читал, а лишь слышал что у классиков это есть. А то, что у них есть совсем не то что мы тут обсуждаем тебе даже в голову не приходит. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

Буфер с байтами передается без проблем, преобразование в текст не требуется. Разбирать и собирать можно байты.

Я бы уже давно всю структуру (она у меня сложнее, тут я сократил ее с целью облегчения восприятия) таким же образом заполнил, но я хочу понять, как это делается проще, через указатели.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, artemkad said:

Понимаешь, у меня все больше закрадывается подозрение, что ты сам их не читал, а лишь слышал что у классиков это есть. А то, что у них есть совсем не то что мы тут обсуждаем тебе даже в голову не приходит.

Если напрячься и открыть оглавление, то можно увидеть вот это:

image.thumb.png.740f4382724061fa444ec206f0491cc0.png

image.thumb.png.da605f02960ed5fd1ded71e4707115f2.png

Я знаю, что и где смотреть, потому лет 20-25 назад всё это прочитал и неоднократно реализовывал парсеры.

Изменено пользователем tonyk_av

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, MementoMori сказал:

Да зачем в текст?

Наглядно, универсально, передавать текст уже умеешь, символы не являющиеся текстом используются для управления потоком.

В общем, то что я нарисовал это а-ля JSON https://ru.wikipedia.org/wiki/JSON .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, MementoMori сказал:

но я хочу понять, как это делается проще, через указатели

1) получить указатель на буфер (именно на буфер, а не на ваш объект каласса TArray1<System::Byte>)

2a) memcpy()

2b) явно привести этот указатель на буфер к типу "указатель на tINFO_VAR" и присвоить структуру по приведенному указателю.

Не видя описания TArray1 очень трудно что-то посоветовать. По вашим примерам видно, что этот класс переопределяет operator[]. Можно, конечно, воспользоваться им, но есть подозрение, что этот класс предоставляет какой-то более удобный в данном случае способ доступа к буферу.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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));

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

Теперь почитайте как размещаются объекты в памяти.

А если у вас принимающая и передающая платформы будут иметь разную разрядность ? И не только.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 минут назад, tonyk_av сказал:

Если напрячься и открыть оглавление, то можно увидеть вот это:

Молодец. А теперь открой Вира раздел 5.1, прочитай второе предложение и продолжай его читать до полного понимания сравнивая термин "символ" который есть там и "символ" во входном потоке. Возможно тогда поймешь к чему было вот это:

  

3 часа назад, artemkad сказал:

Мы тут до полноценного синтаксического разбора еще не дошли - ограничились только этапом поиска лексем во входном потоке.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 minutes ago, dimka76 said:

А если у вас принимающая и передающая платформы будут иметь разную разрядность ? И не только.

Делается под конкретную платформу. Для себя, если быть точным.

Но намек ясен, будут предложения по унификации, с целью платформонезависимости?  Где у меня слабое место?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, MementoMori сказал:

Где у меня слабое место?

Из-за отсутствия синхронизации пакетов, после потери хотя-бы одного байта или появления хотя-бы одного лишнего дальше начинает летать чушь. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, MementoMori said:

Где у меня слабое место?

Размеры типов.

В стандарте на язык Си сказано, что "int" зависит от платформы и выбирается из соображений максимальной производительности, но не меньше short.

image.png.ec7b3b45cae1b981131807949e4a329f.png

25 minutes ago, MementoMori said:

будут предложения по унификации, с целью платформонезависимости?

Сделай Модбас и не мучайся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...