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 писал(а): Дмитрий Грачёв писал(а): символьные цепочки Предлагаю следить за терминологией: |
Автор: | Дмитрий Грачёв [ Пятница, 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)). Зря за исключением случая, когда s совпадает с res.
Выходит, что первый параметр был зря передан по значению, можно было бы его передавать по ссылке и ускорить работу функции Extract. Ах, нашел ответ в описании самого модуля: Цитата: The library is optimized for convenience, not for efficiency. |
Автор: | Дмитрий Грачёв [ Пятница, 02 Ноябрь, 2012 13:25 ] |
Заголовок сообщения: | Re: Передача строк в процедуру |
Т.е., правильно ли я понимаю, что хорошей практикой при организации строковой библиотеки является передача исходной строки как IN-параметр, а результат как OUT-параметр? |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |