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