Передача параметров в подпрограммы

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Передача параметров в подпрограммы

Сообщение GAMER »

Нужно передавать параметрами строки. Результат обработки - строки. Хочется делать оптимально.
Вариант 1. Описываем формальный параметр на прием типа String. При этом выделяется дополнительная память на этот параметр.
Параметр на возврат значения описываем через Var. Выделяется ли при этом память на формальный параметр?
Вариент 2. Передавать адреса на параметры. вроде оптимальнее, но больше возни.

Посоветуйте как правильнее, оптимальнее, или не заморачиваться с этим. "Да сколько там тех символов, можно хоть как" Такой вариант тоже устроит.
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Attid писал(а):http://freepascal.ru/article//freepascal/20070520123650/

Спасибо, то что нужно. Как это я проглядел, самому странно.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Есть ли разница при оптимизации кода? Использовать Var вместо Out, даже если параметр будет только отдаваться с подпрограммы? То есть Out использует для удобства читания кода или есть еще что-то?
Аватара пользователя
*vmr
постоялец
Сообщения: 168
Зарегистрирован: 08.01.2007 00:46:07
Откуда: Киев
Контактная информация:

Сообщение *vmr »

GAMER писал(а):То есть Out использует для удобства читания кода или есть еще что-то?

Он очищает строку перед входом в процедуру
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

*vmr писал(а):
GAMER писал(а):То есть Out использует для удобства читания кода или есть еще что-то?

Он очищает строку перед входом в процедуру

То есть, повышается качество, ухудшается производительность (лишняя операция)? А если параметры не строки?
Аватара пользователя
*vmr
постоялец
Сообщения: 168
Зарегистрирован: 08.01.2007 00:46:07
Откуда: Киев
Контактная информация:

Сообщение *vmr »

GAMER писал(а):А если параметры не строки?

только для managed-типов (строки, дин. массивы, варинанты, интерфейсы)
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

GAMER писал(а):использует для удобства читания кода или есть еще что-то?

чтобы хинтов было меньше =)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Если использовать var для возврата значения, компилятор будет ругаться на неинициализированную переменную. Если использовать out - не будет, т.к. исходное значение переменной в этом случае не имеет значения.
И, если переменная действительно не инициализирована, ее очистка перед вызовом ф-ции - это пустая операция, не ухудшающая быстродействие.
Аватара пользователя
*vmr
постоялец
Сообщения: 168
Зарегистрирован: 08.01.2007 00:46:07
Откуда: Киев
Контактная информация:

Сообщение *vmr »

Sergei I. Gorelkin писал(а):Если использовать var для возврата значения, компилятор будет ругаться на неинициализированную переменную.

Это как? var подразумевает же инициализацию в outer-scope! Например, если мы оттуда читаем значение, а потом только пишем, то "ругания" компилятора — это уже какойто бред
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

*vmr писал(а):
Sergei I. Gorelkin писал(а):Если использовать var для возврата значения, компилятор будет ругаться на неинициализированную переменную.

Это как? var подразумевает же инициализацию в outer-scope! Например, если мы оттуда читаем значение, а потом только пишем, то "ругания" компилятора — это уже какойто бред

Я так понимаю, что когда мы не передаем данные в подпрограмму, а только получаем из нее значение через var параметр, - тогда компилятор ругается.

Отдельно большой респект и благодарность для Sergei I. Gorelkin. Спасибо за многочисленные советы и тонкие подсказки!!!
SII
новенький
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград

Сообщение SII »

Sergei I. Gorelkin писал(а):И, если переменная действительно не инициализирована, ее очистка перед вызовом ф-ции - это пустая операция, не ухудшающая быстродействие.


Любое действие ухудшает быстродействие :) Зачем очищать параметр, объявленный как out, когда достаточно контролировать, чтобы из него не производилось чтение?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Процедура работает с out-параметром, как с обычной переменной. Записав туда что-то, она имеет полное право это что-то прочитать или изменить.
Кроме того, для строк это неважно, а для интерфейсов конкретные моменты удаления/добавления ссылок очень даже имеют значение.
Менять тут что-то очень чревато. А вот выкинуть бессмысленный вызов очистки неинициализированной переменной действительно вполне реально. Думаю, что когда-нибудь это будет реализовано.
Ответить