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' îïèñàíî äàëåêî íå âñ¸, äà è òî - ÷ðåçâû÷àéíî êðàòêî... :-(

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 не требуется. Строки сравниваются просто

одна с другой, без каких либо дополнительных предположений про их длину.

Если их длина разная, они сразу не равны, и все, если длина одинаковая, тогда сравниваются посимвольно.

 

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

 

Еще кодировка Ваших писем отличается от того что прописано в заголовке письма, от этого

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

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. А по существу... Не будет работать в общем случае. О содержимом нулевого элемента вектора параметров командной строки известно только одно - он как-то соотносится с именем, использованным для запуска приложения. Но покрыто мраком несколько важных моментов, как то это полный путь, относительный, имя команды напечатанной в командной строке, али просто имя исполняемого файла...

 

Здравствуйте!

Можно заглянуть на эту статью URL: http://www.mediascan.by/index.files/ada_scr.html

С уважением, Сергей.

Email: ksiby@...

http://www.mediascan.by

 

----- Original Message -----

From: sv_lary

To: ada_ru@yahoogroups.com

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' описано далеко не всё, да и то - чрезвычайно кратко... :-(

 

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

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

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