Ada_Ru форум

Обсуждение языка Ада

Êàê ñðàâíèâàòü ñòðîêè ?

Оставить новое сообщение

Сообщения

sv_lary
Êàê ñðàâíèâàòü ñòðîêè ?
2012-12-10 09:52:21
Íå ìîãó ðàçîáðàòüñÿ ñ òðèâèàëüíîé ïðîáëåìîé :

1) Ãëàâíàÿ ôóíêöèÿ ïðîãðàììû âûáèðàåò ïåðâûé ïàðàìåòð êîìàíäíîé ñòðîêè
2) Ýòî äîëæíî áûòü ñèìâîëè÷åñêîå îáîçíà÷åíèå êîìàíäû ïîëüçîâàòåëÿ
3) Íåîáõîäèìî ñðàâíèòü ýòîò ïàðàìåòð ñî âñåìè çíà÷åíèÿìè èç òàáëèöû êîìàíä è ïðèíÿòü ðåøåíèå î òîì,
÷òî ýòî çà êîìàíäà.

Ïðîáëåìà â òîì, ÷òî â òàáëèöå êîìàíä èõ èìåíà îïèñàíû êàê ñòðîêè ôèêñèðîâàííîé äëèíû, à ïàðàìåòð -
íåèçâåñòíî êàêîé äëèíû. Ïûòàþñü ñðàâíèâàòü âîò òàêèì îïåðàòîðîì :

if Ada.Strings.Fixed.Trim (cmd, Ada.Strings.Left) = 
    Ada.Strings.Fixed.Trim (cmd_name (ind), Ada.Strings.Left) then
 . . .

Ãäå cmd è cmd_name - ñðàâíèâàåìûå ñòðîêè.

Àäåêâàòíîãî ïîâåäåíèÿ ïðîãðàììû íå íàáëþäàåòñÿ. Âèäèìî, Trim äåëàåò ÷òî-òî ñîâñåì íå òî, ÷òî ÿ
ïðåäïîëàãàþ. Â ñâÿçè ñ ýòèì, äâà âîïðîñà :

1) Êàê âñ¸-òàêè ñðàâíèâàòü ïåðåìåííûå String, åñëè äëèíà çíà÷åíèé, íàõîäÿùèõñÿ â ýòèõ ïåðåìåííûõ,
çàðàíåå íå èçâåñòíà ?
2) Ãäå âçÿòü ÏÎÄÐÎÁÍÎÅ îïèñàíèå ôóíêöèè òîãî èëè èíîãî ïàêåòà ? Â ôàéëàõ ñïåöèôèêàöèé (òèïà
a-string.ads) êîììåíòàðèåâ íå ãóñòî, à â äîêóìåíòå 'GNAT Reference Manual' îïèñàíî äàëåêî íå âñ¸,
äà è òî - ÷ðåçâû÷àéíî êðàòêî... :-(
Dmitriy Anisimkov
Re: [ada_ru] Êàê ñðàâíèâàòü ñòðîêè ?
2012-12-10 10:02:17
On 12/10/2012 04:52 PM, sv lary wrote:
> Не могу разобраться с тривиальной проблемой :
>
> 1) Главная функция программы выбирает первый параметр командной строки
> 2) Это должно быть символическое обозначение команды пользователя
> 3) Необходимо сравнить этот параметр со всеми значениями из таблицы команд и принять решение о
том, что это за команда.
>
> Проблема в том, что в таблице команд их имена описаны как строки фиксированной длины, а параметр
- неизвестно какой длины. Пытаюсь сравнивать вот таким оператором :
>
> if Ada.Strings.Fixed.Trim (cmd, Ada.Strings.Left) =
>      Ada.Strings.Fixed.Trim (cmd name (ind), Ada.Strings.Left) then
Подозреваю проблема не в функции Trim а в чем то другом, что бы 
сравнивать параметры командной строки с образцом
функции Trim не требуется. Строки сравниваются просто
одна с другой, без каких либо дополнительных предположений про их длину.
Если их длина разная, они сразу не равны, и все, если длина одинаковая, 
тогда сравниваются посимвольно.

Пошлите маленькоий пример в прицепе к письму, кто нибудь да поможет.

Еще кодировка Ваших писем отличается от того что прописано в заголовке 
письма, от этого
читатели должны догадаться о кодировке самостоятельно и ее переключить, 
это неудобно.
Vadim Godunko
Re: [ada_ru] Êàê ñðàâíèâàòü ñòðîêè ?
2012-12-10 10:32:15
On 12/10/2012 01:52 PM, sv_lary wrote:
> 
> Адекватного поведения программы не наблюдается. Видимо, Trim делает
> что-то совсем не то, что я предполагаю. В связи с этим, два вопроса :
> 
> 1) Как всё-таки сравнивать переменные String, если длина значений,
> находящихся в этих переменных, заранее не известна ?
Сравнивать как объекты, в Ada так делать можно и нужно.

> 2) Где взять ПОДРОБНОЕ описание функции того или иного пакета ? В файлах
> спецификаций (типа a-string.ads) комментариев не густо, а в документе
> 'GNAT Reference Manual' описано далеко не всё, да и то - чрезвычайно
> кратко... :-(
См. ARM, например, http://www.ada-auth.org/standards/ada12.html

PS. А по существу... Не будет работать в общем случае. О содержимом
нулевого элемента вектора параметров командной строки известно только
одно - он как-то соотносится с именем, использованным для запуска
приложения. Но покрыто мраком несколько важных моментов, как то это
полный путь, относительный, имя команды напечатанной в командной строке,
али просто имя исполняемого файла...
ksiby
Re: [ada_ru] Как сравнивать строки ?
2012-12-10 10:32:39
Здравствуйте!
Можно заглянуть на эту статью URL: http://www.mediascan.by/index.files/ada scr.html 
С уважением, Сергей.
Email: ksiby@...
http://www.mediascan.by

  ----- Original Message ----- 
  From: sv lary 
  To: ada [email protected] 
  Sent: Monday, December 10, 2012 12:52 PM
  Subject: [ada ru] Как сравнивать строки ?


    
  Не могу разобраться с тривиальной проблемой :

  1) Главная функция программы выбирает первый параметр командной строки
  2) Это должно быть символическое обозначение команды пользователя
  3) Необходимо сравнить этот параметр со всеми значениями из таблицы команд и принять решение о
том, что это за команда.

  Проблема в том, что в таблице команд их имена описаны как строки фиксированной длины, а параметр
- неизвестно какой длины. Пытаюсь сравнивать вот таким оператором :

  if Ada.Strings.Fixed.Trim (cmd, Ada.Strings.Left) = 
  Ada.Strings.Fixed.Trim (cmd name (ind), Ada.Strings.Left) then
  . . .

  Где cmd и cmd name - сравниваемые строки.

  Адекватного поведения программы не наблюдается. Видимо, Trim делает что-то совсем не то, что я
предполагаю. В связи с этим, два вопроса :

  1) Как всё-таки сравнивать переменные String, если длина значений, находящихся в этих переменных,
заранее не известна ?
  2) Где взять ПОДРОБНОЕ описание функции того или иного пакета ? В файлах спецификаций (типа
a-string.ads) комментариев не густо, а в документе 'GNAT Reference Manual' описано далеко не всё,
да и то - чрезвычайно кратко... :-(

  
Vasiliy Fofanov
Re: [ada_ru] Как сравнивать строки ?
2012-12-10 10:52:22
> Не могу разобраться с тривиальной проблемой :
> 
> 1) Главная функция программы выбирает первый параметр командной строки
> 2) Это должно быть символическое обозначение команды пользователя
> 3) Необходимо сравнить этот параметр со всеми значениями из таблицы команд и принять решение о
том, что это за команда.

Разрешите я вам дан асимметричный ответ. Не хотите ли вы просто проиндексировать свою таблицу
перечислимым типом и использовать 'Value для трансляции из одного в другое?

Типа:

type Command is (Start, Stop);

type Map_Type is array (Command) of ...;

Map : Map_Type;

S : String := "Start";
C : Command := Command'Value (S);

... Map (C) ...

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

> Проблема в том, что в таблице команд их имена описаны как строки фиксированной длины, а параметр
- неизвестно какой длины. Пытаюсь сравнивать вот таким оператором :
> 
> if Ada.Strings.Fixed.Trim (cmd, Ada.Strings.Left) = 
>    Ada.Strings.Fixed.Trim (cmd_name (ind), Ada.Strings.Left) then
> . . .
> 
> Где cmd и cmd_name - сравниваемые строки.
> 
> Адекватного поведения программы не наблюдается. Видимо, Trim делает что-то совсем не то, что я
предполагаю. В связи с этим, два вопроса :

В такой ситуации лучше быть конкретнее и описать что же именно вами наблюдается :) Но навскидку
вызывает удивление что вы выбрали именно параметр Left, а не Right или еще лучше Both - Left
удаляет *ведущие* пробелы, не похоже что это ваш случай.

> 1) Как всё-таки сравнивать переменные String, если длина значений, находящихся в этих переменных,
заранее не известна ?

Ваш подход в целом правильный, если хотите делать все вручную.

> 2) Где взять ПОДРОБНОЕ описание функции того или иного пакета ? В файлах спецификаций (типа
a-string.ads) комментариев не густо, а в документе 'GNAT Reference Manual' описано далеко не всё,
да и то - чрезвычайно кратко... :-(

А зачем же вы ищете описание СТАНДАРТНОЙ функции в каком-либо ином месте, кроме СТАНДАРТА ЯЗЫКА? А
именно параграф А.4.3(89)

ВФ
Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти