Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.08.2007, 10:59
Shelms Shelms вне форума
Прохожий
 
Регистрация: 03.08.2007
Сообщения: 6
Репутация: 10
По умолчанию Объявление формальных параметров подпрограмм

Здравствуйте, уважаемый!

Вопрос у меня такой - как объявить параметр подпрограммы, передаваемый по ссылке, чтобы его нельзя было изменять.
Т.е. для меня ясно использование (const i: integer) - неизменяемая копия;
(var i: integer) - работа с оригиналом через ссылку. И вот мне нужно, чтобы эта работа с оригиналом была только на чтение значения.

Благодарю за внимание и возможные советы!
Ответить с цитированием
  #2  
Старый 03.08.2007, 12:24
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

ничего не указывать перед именем параметра, т.е.
Код:
procedure SomeProc(SomePar:Integer);
Ответить с цитированием
  #3  
Старый 03.08.2007, 12:48
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Можно использовать const. Несколько соображений.
1)Если передаётся массив, то передача всё-равно пойдёт по ссылке.
2) Если передаётся структурированный объект, то поля можно будет изменять (напр., если Canvas нельзя поменять, то Canvas.Font можно)
3) В Java предусмотрена процедура клонирования, т.е. делается копия объекта и передаётся ссылка на копию, а оригинал никто не поменяет.
Ответить с цитированием
  #4  
Старый 21.08.2007, 16:01
Shelms Shelms вне форума
Прохожий
 
Регистрация: 03.08.2007
Сообщения: 6
Репутация: 10
По умолчанию Вопрос считаю незакрытым

Мой вопрос нужно перефразировать -
как на дельфи записать прототип функции СИ++:
"f1(const int *Arr)", т.е. требуется, чтобы в теле процедуры, Arr представлял собой по сути фактический параметр, который подпрограмма не должна изменять.

Следующие варианты записи аналогичной подпрограммы на дельфи не подходят, так не удовлетворяют вышеизложенному требованию:
f1(var Arr: TArr); - работа с оригиналом, но последний может быть изменен
f1(const Arr: TArr) - работа с копией фактического параметра, которую нельзя редактировать;

f1(Arr: TArr) - копия фактического параметра, которую можно редактировать.

Манипуляции с f1(Arr: array of integer) - дают те же результаты

Похоже, что на дельфи повторить описание "сишной" подпрограммы не удастся и нужно просто быть предельно внимательным, хотя это само собой разумеется.

Спасибо!
Ответить с цитированием
  #5  
Старый 22.08.2007, 05:28
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А чем не устраивает работа с копией?
Ответить с цитированием
  #6  
Старый 22.08.2007, 10:27
Shelms Shelms вне форума
Прохожий
 
Регистрация: 03.08.2007
Сообщения: 6
Репутация: 10
По умолчанию

Хотя бы тем, что на передачу копии может потребоваться достаточно много времени
Ответить с цитированием
  #7  
Старый 22.08.2007, 19:26
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Цитата:
f1(var Arr: TArr); - работа с оригиналом, но последний может быть изменен
С этим утверждением я согласен.
Цитата:
f1(const Arr: TArr) - работа с копией фактического параметра, которую нельзя редактировать;
Это работа с оригиналом, который нельзя редактировать.
Цитата:
f1(Arr: TArr) - копия фактического параметра, которую можно редактировать.
Копия фактического параметра создается только внутри функции, так что ее изменение не влияет на оригинал.

Ответ на твой вопрос - f1(const Arr: TArr)
Ответить с цитированием
  #8  
Старый 27.08.2007, 09:22
Shelms Shelms вне форума
Прохожий
 
Регистрация: 03.08.2007
Сообщения: 6
Репутация: 10
По умолчанию Ура! Всем большое спасибо!

Особая благодарность Decoding за окончательное разрешение моего вопроса и работу над ошибками
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter