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 ]
Заголовок сообщения: 

Илья Ермаков, спасибо большое! :)

Только теперь еще одна проблема. Похоже, я не до конца разобрался, как в КП работать со строками... :D

При вызове этой процедуры -- выход индекса за границы массива. Дело тут, я думаю, в 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/