OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 23 Апрель, 2019 05:22

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Incompatible parameter list -- вопрос новичка
СообщениеДобавлено: Вторник, 30 Январь, 2007 22:56 

Зарегистрирован: Воскресенье, 21 Январь, 2007 19:28
Сообщения: 14
Здравствуйте!

В Обероне, КП и ББ я новичок... Совсем недавно познакомился с этими замечательными языками и средой ББ. ;) До этого, да и сейчас, работаю в 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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9115
Откуда: Россия, Орёл
Здравствуйте, Ярослав!

Когда с коммандера вызывается процедура с параметрами, то весь вызов берется в двойные кавычки, а в данных используются одинарные (в Обероне строка может браться в любые кавычки):

Т.е. надо так:
(COMMANDER)"MyFirst.CheckBrackets('(abc)+14(123(2*3))')"

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

И еще - параметр лучше записать как:
PROCEDURE CheckBrackets* (IN str: ARRAY OF CHAR)
- тогда не будет лишнего копирования строки. IN - это тот же VAR, только для чтения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 31 Январь, 2007 06:53 

Зарегистрирован: Воскресенье, 21 Январь, 2007 19:28
Сообщения: 14
Илья Ермаков, спасибо большое! :)

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

При вызове этой процедуры -- выход индекса за границы массива. Дело тут, я думаю, в len := LEN(Str), так как в окне "Trap" значение этой переменной -- 256, а в строке, которую я передаю в процедуру, только 18 символов.

Хотя, если посмотреть на значение переменной j, то оно будет правильным -- по результатам работы цикла.

Подскажите, как можно узнать количество символов в строке (а это, как я понял, не одно и то же с длиной строки -- это не в Delphi Lenght(Str) писать :)), чтобы таких неприятностей не происходило?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 31 Январь, 2007 08:10 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Нужно писать 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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9115
Откуда: Россия, Орёл
Иван, а откуда вообще пошло поветрие пользовать StdLog (я и сам так привык)? Я так понимаю, от первых русскоязычных руководств Информатики-21?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 31 Январь, 2007 12:09 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9115
Откуда: Россия, Орёл
Поискал в исходниках - сплошь и рядом в самой среде импортируется StdLog, даже в примерах Obx!
Log нужен для использования в низкоуровневых модулях, поскольку StdLog тянет за собой много лишнего и иожет дать Cyclic Import...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 31 Январь, 2007 13:50 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1183
Log появился тоько в 1.4


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 31 Январь, 2007 16:05 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Иногда приходится использовать StdLog потому что StdLog.Int(n: LONGINT); в то время как Log.Int(n: INTEGER).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 31 Январь, 2007 16:13 

Зарегистрирован: Пятница, 02 Декабрь, 2005 14:35
Сообщения: 190
Откуда: Россия, Томск
Коллеги!

При попытке вызвать документацию по Log получаю ответ системы:
"Модуль имеет закрытый интерфейс, он используется только внутри системы."

Сие означает, что разработчики не дают его пользователям, он ДСП!

Так чему же учить: StdLog или Log? Что есть методически правильно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 01 Февраль, 2007 03:07 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Я думаю методически правильно - сделать документашку для Log, и ему учить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 01 Февраль, 2007 11:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9115
Откуда: Россия, Орёл
Хм, Иван, недокументированный модуль.. Оминк его ввели для низкоуровневого импорта - исключительно...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 01 Февраль, 2007 11:44 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1183
Илья Ермаков писал(а):
Оминк его ввели для низкоуровневого импорта - исключительно...

Чисто интерфейсный модуль для низкоуровневого импорта, оригинально-с. ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 01 Февраль, 2007 12:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9115
Откуда: Россия, Орёл
Чтобы избежать Cyclic Import...
Иначе почему не документировали, если делали как замену StdLog?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 01 Февраль, 2007 13:01 

Зарегистрирован: Воскресенье, 21 Январь, 2007 19:28
Сообщения: 14
Огромное спасибо вам всем! :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 01 Февраль, 2007 13:36 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Илья, они много чего не документировали. Sequencers, например - а это низкоуровневый модуль, или им просто "Project BlackBox" писать не захотелось?
С Log на мой взгляд история простая - ввели недавно, посчитали интерфейс неустоявшимся, документирование оставили на когда интерфейс зафиксируют. Ну а потом началась перестройка, гласность...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 01 Февраль, 2007 13:47 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9115
Откуда: Россия, Орёл
В принципе, да. Поглядим, в каком виде будет 1.6.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Февраль, 2007 10:21 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Илья Ермаков писал(а):
В принципе, да. Поглядим, в каком виде будет 1.6.

А когда примерно ожидается версия 1.6?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Февраль, 2007 12:17 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4258
Откуда: Россия, Орёл
Хе-хе...

Предположительно март 2007 года. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Февраль, 2007 23:44 

Зарегистрирован: Вторник, 06 Декабрь, 2005 15:18
Сообщения: 5
Это точно или с потолка, что март 2007?
Выпускают швейцарцы?
По мне - уж лучше бы не томили душу. Интересно было бы узнать, что ожидается.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB