Íå ìîãó ðàçîáðàòüñÿ ñ òðèâèàëüíîé ïðîáëåìîé :
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)
ВФ
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти