Форум по микроконтроллерам: ПП сравнение целой строки как переменной - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

ПП сравнение целой строки как переменной

#1 Пользователь офлайн   Mizar 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 162
  • Регистрация: 09 Март 11

Отправлено 03 Июнь 2011 - 18:50

Подскажите, как програмно сравнить целую строку.
Например, получаем через компорт данные в одну строку, завершаем командой ввода, получивши строку в буфере контроллера необходимо ее сравнить с некой базой.

Может есть готовые куски программы на Си, ? спасибо.
Любая сложная задача имеет простое, легкое для понимания неправильное решение...
0

#2 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 888
  • Регистрация: 15 Февраль 11

Отправлено 04 Июнь 2011 - 11:15

Создаёте обычный цикл и в нём сравниваете побайтно всю строку.
Существуют и стандартные СИшные ф-ии.
int	strcmp(const char *, const char *);
Сранивает две строки с учётом регистра.

int	stricmp(const char *, const char *);
Сравнивает две строки без учёта регистра.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#3 Пользователь офлайн   Mizar 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 162
  • Регистрация: 09 Март 11

Отправлено 06 Июнь 2011 - 10:34

Хорошо, а если нужно сравнить с базой "слов", причем слова разной длинны. Это нужно будет циклично каждое слово проверять, пока не совпадет?
Я думал может для начала получишви слово, сравнивая по длинне со словами с базой, сравнивать сначала первый символ, затаем сравнивать второй с неми где совпал первый, и т.д. Может так будет быстрее, или я заблуждаюсь? Да и потом, хочется это как то эргономично реализовать.
Любая сложная задача имеет простое, легкое для понимания неправильное решение...
0

#4 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 888
  • Регистрация: 15 Февраль 11

Отправлено 06 Июнь 2011 - 11:38

Цитата

причем слова разной длинны.
Ну они чемто заканчиваются. Нулевым значением, например. Это значение и будет условием конца строки.

Не понятно что за база такая у Вас ? Что она из себя представляет ?
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#5 Пользователь офлайн   Mizar 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 162
  • Регистрация: 09 Март 11

Отправлено 07 Июнь 2011 - 09:38

Есть аппаратура, обмен ведется по своему протоколу, необхоимо принимать все слова с одной стороны, сравнивать и отадавать другой стороне Если не совплао, данные проходят без изменения, если словл совпало с одним из базы, то проигнорировать передачу или изменить, подменить так сказать.
Поток небольшой, но в целом если долго проверять, придется долго ждать. Передающий дает одно слово, и ждет подтверждения обработки. Принимающий принял, обработал, дает команду что свободен, и ждет новые данные.
В моей базе будет примерно 80 команд, которые имеют длинну от FFFF до FFFFFFFFFFFF. Ну как то так.
Любая сложная задача имеет простое, легкое для понимания неправильное решение...
0

#6 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 888
  • Регистрация: 15 Февраль 11

Отправлено 07 Июнь 2011 - 13:16

А команды известны ? Есть символ конца строки и одинаков он для всех команд ?
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#7 Пользователь офлайн   Mizar 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 162
  • Регистрация: 09 Март 11

Отправлено 25 Сентябрь 2016 - 19:34

Добрый день.
Вопрос про sprintf.
Непонятный прикол, при выполнении кода.
int Val;
Disp2[4];
sprintf (Disp2, "%4d", Val);


Почему то после заполнения массива Disp2 переменная Val обнуляется.

Пока писал, нашел в чем проблема. Память распределилась таким образом, что после массива расположилась переменная...
После заполнения массива почему то sprintf заполняет не 4 а 5 элементов массива, что и приводит к вмешательству в область переменной Val.

Сообщение отредактировал Mizar: 25 Сентябрь 2016 - 19:52

Любая сложная задача имеет простое, легкое для понимания неправильное решение...
0

#8 Пользователь офлайн   mf323 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 83
  • Регистрация: 27 Январь 13
  • ГородУфа

Отправлено 25 Сентябрь 2016 - 22:08

ого,5 лет паузы. Что-то я смотрю у вас с Алексом как-то резко тема тогда оборвалась. Так в итоге то, что там с аппаратурой, которая обмен вела, получилось?
0

#9 Пользователь офлайн   Mizar 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 162
  • Регистрация: 09 Март 11

Отправлено 25 Сентябрь 2016 - 23:12

Да, я сменил место работы, а тут новый проект, искал информацию наткнулся на свою тему.
А с той аппаратурой получилось не совсем то что хотелось, а потом поменялись законы, кризис и потребность отпала.
Любая сложная задача имеет простое, легкое для понимания неправильное решение...
0

#10 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 888
  • Регистрация: 15 Февраль 11

Отправлено 26 Сентябрь 2016 - 11:02

Всегда выделяйте буфер для таких вещей с запасом. Просто возьмите за правило.
А 5-ый элемент массива - символ окончания строки ('\0'), sprintf всегда его вставляет. Собственно, любая строка в Си-представлении, оканчивается этим символом.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#11 Пользователь офлайн   Mizar 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 162
  • Регистрация: 09 Март 11

Отправлено 26 Сентябрь 2016 - 23:44

Вот оно что. Спасибо за информацию. про ('\0') не знал.
На деле так и сделал взял с запасом.
Любая сложная задача имеет простое, легкое для понимания неправильное решение...
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей