OberonCore
https://forum.oberoncore.ru/

Передача строк в процедуру
https://forum.oberoncore.ru/viewtopic.php?f=29&t=4145
Страница 1 из 1

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

Как известно, во многих языках нет встроенного типа данных "строка", но есть символьные цепочки, которые можно хранить в символьном массиве.

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

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

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

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

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

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

Автор:  Alexander Shiryaev [ Четверг, 01 Ноябрь, 2012 20:36 ]
Заголовок сообщения:  Re: Передача строк в процедуру

В компонентном паскале строку-константу можно передавать в процедуру с описателем IN:

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

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

Автор:  Иван Кузьмицкий [ Четверг, 01 Ноябрь, 2012 20:41 ]
Заголовок сообщения:  Re: Передача строк в процедуру

Вы хотите всех запутать с понятиями L-value, R-value, которые уродились на почве какого-нить С++? :) К тому же, если я не ошибаюсь, оба этих термина связаны с адресной арифметикой, которая не очень актуальна для КП.

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

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

Дмитрий Грачёв писал(а):
символьные цепочки
Предлагаю следить за терминологией:

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

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

Автор:  Евгений Темиргалеев [ Пятница, 02 Ноябрь, 2012 09:52 ]
Заголовок сообщения:  Re: Передача строк в процедуру

Info21 писал(а):
Дмитрий Грачёв писал(а):
символьные цепочки
Предлагаю следить за терминологией:
посредством Docu/ru/RuComments (см. http://oberoncore.ru/projects/bb-docu-ru)

Автор:  Дмитрий Грачёв [ Пятница, 02 Ноябрь, 2012 12:54 ]
Заголовок сообщения:  Re: Передача строк в процедуру

Вопрос даже шире, чем я думал.
Вот объявление модуля 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.

Автор:  Евгений Темиргалеев [ Пятница, 02 Ноябрь, 2012 13:24 ]
Заголовок сообщения:  Re: Передача строк в процедуру

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

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

Автор:  Дмитрий Грачёв [ Пятница, 02 Ноябрь, 2012 13:25 ]
Заголовок сообщения:  Re: Передача строк в процедуру

Т.е., правильно ли я понимаю, что хорошей практикой при организации строковой библиотеки является передача исходной строки как IN-параметр, а результат как OUT-параметр?

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/