OberonCore https://forum.oberoncore.ru/ |
|
Incompatible parameter list -- вопрос новичка https://forum.oberoncore.ru/viewtopic.php?f=35&t=372 |
Страница 1 из 1 |
Автор: | Ярослав Ерёменко [ Вторник, 30 Январь, 2007 22:56 ] |
Заголовок сообщения: | Incompatible parameter list -- вопрос новичка |
Здравствуйте! В Обероне, КП и ББ я новичок... Совсем недавно познакомился с этими замечательными языками и средой ББ. До этого, да и сейчас, работаю в Delphi на "средненьком" уровне. Да, бывают и такие. Вот код: Код: PROCEDURE CheckBrackets* (Str: ARRAY OF CHAR);
VAR i, j, len: INTEGER; BEGIN len := LEN(Str); FOR i := 0 TO len DO IF Str[i] = "(" THEN INC(j) ELSIF Str[i] = ")" THEN DEC(j) END; END; StdLog.Bool(j > 0) END CheckBrackets; Он подсчитивает количество открывающих и закрывающих скобок в строке, и выводит результат в журнал. А вопрос по нему такой. Почему при вызове этой процедуры, например, через коммандер, выдается сообщение "MyFirst.CheckBrackets command error: incompatible parameter list in". Вызываю CheckBrackets я так: MyFirst.CheckBrackets("(abc)+14(123(2*3))"). Я думаю, что "начудил" в "заголовке" процедуры, но сам разобраться никак не могу... |
Автор: | Илья Ермаков [ Вторник, 30 Январь, 2007 23:46 ] |
Заголовок сообщения: | |
Здравствуйте, Ярослав! Когда с коммандера вызывается процедура с параметрами, то весь вызов берется в двойные кавычки, а в данных используются одинарные (в Обероне строка может браться в любые кавычки): Т.е. надо так: (COMMANDER)"MyFirst.CheckBrackets('(abc)+14(123(2*3))')" Если будете писать команды для кнопок или ссылок - там наружные кавычки не нужны, но вот в строковых параметрах все равно используются только одинарные... И еще - параметр лучше записать как: PROCEDURE CheckBrackets* (IN str: ARRAY OF CHAR) - тогда не будет лишнего копирования строки. IN - это тот же VAR, только для чтения. |
Автор: | Ярослав Ерёменко [ Среда, 31 Январь, 2007 06:53 ] |
Заголовок сообщения: | |
Илья Ермаков, спасибо большое! Только теперь еще одна проблема. Похоже, я не до конца разобрался, как в КП работать со строками... При вызове этой процедуры -- выход индекса за границы массива. Дело тут, я думаю, в len := LEN(Str), так как в окне "Trap" значение этой переменной -- 256, а в строке, которую я передаю в процедуру, только 18 символов. Хотя, если посмотреть на значение переменной j, то оно будет правильным -- по результатам работы цикла. Подскажите, как можно узнать количество символов в строке (а это, как я понял, не одно и то же с длиной строки -- это не в Delphi Lenght(Str) писать ), чтобы таких неприятностей не происходило? |
Автор: | Иван Горячев [ Среда, 31 Январь, 2007 08:10 ] |
Заголовок сообщения: | |
Нужно писать len := LEN(str$) - 1; Операция $ описана в сообщении по языку. А -1 потому что индексация символов начинается с нуля, а не с 1, как в Дельфи. А вообще, можно обойтись и без определения длины строки, бо все строки в КП оканчиваются 0X: Код: PROCEDURE CheckBrackets* (IN str: ARRAY OF CHAR);
VAR i, j: INTEGER; BEGIN i := 0; j := 0; WHILE (i < LEN(str)) & (str[i] # 0X) DO IF str[i] = "(" THEN INC(j) ELSIF str[i] = ")" THEN DEC(j) END; END; Log.Bool(j > 0) END CheckBrackets; Сравнение i < LEN(str) можно убрать, если у Вас гарантируется, что строка оканчивается нулём. Можно не выносить его в отдельную переменную, потому как взятие длины массива операция быстрая, в отличие от вычисления длины строки (тут я может и не прав, старшие товарищи поправят). Вместо StdLog лучше применять модуль Log - не факт, что StdLog окажется в любой системе, в которой работает Ваша программа (в консоли его нет, например). Это общее правило в компонентной среде - использовать интерфейсные модули, а не модули реализации. |
Автор: | Илья Ермаков [ Среда, 31 Январь, 2007 12:06 ] |
Заголовок сообщения: | |
Иван, а откуда вообще пошло поветрие пользовать StdLog (я и сам так привык)? Я так понимаю, от первых русскоязычных руководств Информатики-21? |
Автор: | Илья Ермаков [ Среда, 31 Январь, 2007 12:09 ] |
Заголовок сообщения: | |
Поискал в исходниках - сплошь и рядом в самой среде импортируется StdLog, даже в примерах Obx! Log нужен для использования в низкоуровневых модулях, поскольку StdLog тянет за собой много лишнего и иожет дать Cyclic Import... |
Автор: | Trurl [ Среда, 31 Январь, 2007 13:50 ] |
Заголовок сообщения: | |
Log появился тоько в 1.4 |
Автор: | Сергей Губанов [ Среда, 31 Январь, 2007 16:05 ] |
Заголовок сообщения: | |
Иногда приходится использовать StdLog потому что StdLog.Int(n: LONGINT); в то время как Log.Int(n: INTEGER). |
Автор: | А.П. [ Среда, 31 Январь, 2007 16:13 ] |
Заголовок сообщения: | |
Коллеги! При попытке вызвать документацию по Log получаю ответ системы: "Модуль имеет закрытый интерфейс, он используется только внутри системы." Сие означает, что разработчики не дают его пользователям, он ДСП! Так чему же учить: StdLog или Log? Что есть методически правильно? |
Автор: | Иван Горячев [ Четверг, 01 Февраль, 2007 03:07 ] |
Заголовок сообщения: | |
Я думаю методически правильно - сделать документашку для Log, и ему учить. |
Автор: | Илья Ермаков [ Четверг, 01 Февраль, 2007 11:07 ] |
Заголовок сообщения: | |
Хм, Иван, недокументированный модуль.. Оминк его ввели для низкоуровневого импорта - исключительно... |
Автор: | Trurl [ Четверг, 01 Февраль, 2007 11:44 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): Оминк его ввели для низкоуровневого импорта - исключительно...
Чисто интерфейсный модуль для низкоуровневого импорта, оригинально-с. |
Автор: | Илья Ермаков [ Четверг, 01 Февраль, 2007 12:26 ] |
Заголовок сообщения: | |
Чтобы избежать Cyclic Import... Иначе почему не документировали, если делали как замену StdLog? |
Автор: | Ярослав Ерёменко [ Четверг, 01 Февраль, 2007 13:01 ] |
Заголовок сообщения: | |
Огромное спасибо вам всем! |
Автор: | Иван Горячев [ Четверг, 01 Февраль, 2007 13:36 ] |
Заголовок сообщения: | |
Илья, они много чего не документировали. Sequencers, например - а это низкоуровневый модуль, или им просто "Project BlackBox" писать не захотелось? С Log на мой взгляд история простая - ввели недавно, посчитали интерфейс неустоявшимся, документирование оставили на когда интерфейс зафиксируют. Ну а потом началась перестройка, гласность... |
Автор: | Илья Ермаков [ Четверг, 01 Февраль, 2007 13:47 ] |
Заголовок сообщения: | |
В принципе, да. Поглядим, в каком виде будет 1.6. |
Автор: | Штирлиц [ Пятница, 02 Февраль, 2007 10:21 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): В принципе, да. Поглядим, в каком виде будет 1.6.
А когда примерно ожидается версия 1.6? |
Автор: | Борис Рюмшин [ Пятница, 02 Февраль, 2007 12:17 ] |
Заголовок сообщения: | |
Хе-хе... Предположительно март 2007 года. |
Автор: | GrayEddy [ Пятница, 02 Февраль, 2007 23:44 ] |
Заголовок сообщения: | |
Это точно или с потолка, что март 2007? Выпускают швейцарцы? По мне - уж лучше бы не томили душу. Интересно было бы узнать, что ожидается. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |