OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 20 Сентябрь, 2019 06:12

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Передача строк в процедуру
СообщениеДобавлено: Четверг, 01 Ноябрь, 2012 20:29 

Зарегистрирован: Суббота, 17 Сентябрь, 2011 16:39
Сообщения: 72
Как известно, во многих языках нет встроенного типа данных "строка", но есть символьные цепочки, которые можно хранить в символьном массиве.

Интересует вопрос передачи строки в процедуру.
Если передавать строку по значению, то, если язык поддерживает семантику копирования значений, это приведет к копированию всего массива. Это долго.
Если передавать строку по ссылке, то это быстро, но возникает вопрос: передавать по ссылке можно только L-value, но символьная цепочка является R-value, следовательно ее нельзя подставлять как параметр, передаваемый по ссылке.

Например, есть процедура

процедура Распечатать(перем Строка стр)
или
процедура Распечатать(перем символ[] стр)

то ее нельзя будет вызвать так:
вызвать Распечатать("Привет, мир!");

Но можно вызвать так:
переменная символ[] стр = "Привет, мир!";
вызвать Распечатать(стр);

Но это не удобно.
Как лучше решить этот вопрос?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача строк в процедуру
СообщениеДобавлено: Четверг, 01 Ноябрь, 2012 20:36 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 438
Откуда: Егорьевск
В компонентном паскале строку-константу можно передавать в процедуру с описателем IN:

Код:
PROCEDURE P (IN s: ARRAY OF CHAR);
BEGIN
    ...
END P;

P("Привет, мир!");


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача строк в процедуру
СообщениеДобавлено: Четверг, 01 Ноябрь, 2012 20:41 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2931
Откуда: г. Ярославль
Вы хотите всех запутать с понятиями L-value, R-value, которые уродились на почве какого-нить С++? :) К тому же, если я не ошибаюсь, оба этих термина связаны с адресной арифметикой, которая не очень актуальна для КП.

Ну а КП жёстко задаёт способ передачи. Если вы указали VAR, то будьте добры передать переменную. Надёжность требует ограничений, к сожалению.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача строк в процедуру
СообщениеДобавлено: Четверг, 01 Ноябрь, 2012 21:05 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8174
Откуда: Троицк, Москва
Дмитрий Грачёв писал(а):
символьные цепочки
Предлагаю следить за терминологией:

"литерная цепочка" ощутимо точнее.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача строк в процедуру
СообщениеДобавлено: Пятница, 02 Ноябрь, 2012 09:52 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Info21 писал(а):
Дмитрий Грачёв писал(а):
символьные цепочки
Предлагаю следить за терминологией:
посредством Docu/ru/RuComments (см. http://oberoncore.ru/projects/bb-docu-ru)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача строк в процедуру
СообщениеДобавлено: Пятница, 02 Ноябрь, 2012 12:54 

Зарегистрирован: Суббота, 17 Сентябрь, 2011 16:39
Сообщения: 72
Вопрос даже шире, чем я думал.
Вот объявление модуля Strings:
Код:
DEFINITION Strings;

   CONST
      charCode = -1; decimal = 10; hexadecimal = -2; roman = -3;
      digitspace = 8FX;
      hideBase = FALSE; showBase = TRUE;

   PROCEDURE Valid (IN s: ARRAY OF CHAR): BOOLEAN;
   PROCEDURE Extract (s: ARRAY OF CHAR; pos, len: INTEGER; OUT res: ARRAY OF CHAR);
   PROCEDURE Find (IN s: ARRAY OF CHAR; IN pat: ARRAY OF CHAR; start: INTEGER;
                           OUT pos: INTEGER);
   PROCEDURE Replace (VAR s: ARRAY OF CHAR; pos, len: INTEGER; IN rep: ARRAY OF CHAR);
   PROCEDURE Lower (ch: CHAR): CHAR;
   PROCEDURE Upper (ch: CHAR): CHAR;
   PROCEDURE ToLower (in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
   PROCEDURE ToUpper (in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);

   PROCEDURE IntToString (x: LONGINT; OUT s: ARRAY OF CHAR);
   PROCEDURE IntToStringForm (x: LONGINT; form, minWidth: INTEGER; fillCh: CHAR;
                                       showBase: BOOLEAN; OUT s: ARRAY OF CHAR);
   PROCEDURE RealToString (x: REAL; OUT s: ARRAY OF CHAR);
   PROCEDURE RealToStringForm (x: REAL; precision, minW, expW: INTEGER; fillCh: CHAR;
                                             OUT s: ARRAY OF CHAR);
   PROCEDURE StringToInt (IN s: ARRAY OF CHAR; OUT x, res: INTEGER);
   PROCEDURE StringToLInt (IN s: ARRAY OF CHAR; OUT x: LONGINT; res: INTEGER);
   PROCEDURE StringToReal (IN s: ARRAY OF CHAR; OUT x: REAL; OUT res: INTEGER);

END Strings.


Рассмотрим процедуру PROCEDURE Extract (s: ARRAY OF CHAR; pos, len: INTEGER; OUT res: ARRAY OF CHAR);

Первый параметр входит по значению, а результат выходит по ссылке.
При этом первый параметр используется только для чтения, а внутри процедуры происходит копирование элементов с pos по min(pos+len, размер(s)).
Выходит, что первый параметр был зря передан по значению, можно было бы его передавать по ссылке и ускорить работу функции Extract.

Ах, нашел ответ в описании самого модуля:
Цитата:
The library is optimized for convenience, not for efficiency.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача строк в процедуру
СообщениеДобавлено: Пятница, 02 Ноябрь, 2012 13:24 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Дмитрий Грачёв писал(а):
При этом первый параметр используется только для чтения, а внутри процедуры происходит копирование элементов с pos по min(pos+len, размер(s)).
Выходит, что первый параметр был зря передан по значению, можно было бы его передавать по ссылке и ускорить работу функции Extract.

Ах, нашел ответ в описании самого модуля:
Цитата:
The library is optimized for convenience, not for efficiency.
Зря за исключением случая, когда s совпадает с res.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача строк в процедуру
СообщениеДобавлено: Пятница, 02 Ноябрь, 2012 13:25 

Зарегистрирован: Суббота, 17 Сентябрь, 2011 16:39
Сообщения: 72
Т.е., правильно ли я понимаю, что хорошей практикой при организации строковой библиотеки является передача исходной строки как IN-параметр, а результат как OUT-параметр?


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

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


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

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


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

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