Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> procedure и её пораметры (const var); Пару вопросов??? 
V
    Опции темы
ivan219
Дата 30.10.2006, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Скажите какой из вареанто верный.

procedure(var a,b: Integer; c: String);

1. var относится только к a,b
2. var относится к a,b,c

Также и с Const если написать procedure(const a,b: Integer; c:String);
Будетли Const относится к a,b,c

А то я что-то не разобрался???????
PM MAIL ICQ   Вверх
digs
Дата 30.10.2006, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 14.10.2006

Репутация: нет
Всего: 1



и const и var радотают до точки с запятой
PM MAIL   Вверх
ivan219
Дата 30.10.2006, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



И ещё какая разница меду записями:

Procedure(const A: Integer);

Procedure(A: Integer);

Т.е. как они будут выглядеть в EXE файле и как будут работать (быстрее) так как я вкниге читал что используя const можно оптимизировать прцедуру.
PM MAIL ICQ   Вверх
Snowy
Дата 30.10.2006, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Если const, то физически в процедуру передаётся не значение A, а указатель на исходную переменную. 
То же самое происходит и в случае var, но в var переменную разрешено менять. 
Соответственно только в случае var исходная переменная изменится. 
Без var можно менять A, как угодно - на исходную переменную не повлияет. 
С const вообще нельзя менять A.
Никакого ускорения от этого быть не может. 
С точки зрения скорости, не имеет никакого значения, что именно класть в стек - значение или указатель.
Извлекаем мы всё равно всё те же 4 байта. А дальше всё равно по какому адресу брать значение - скорость та же.
PM MAIL   Вверх
Fedia
Дата 30.10.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Параметр const нельзя изменять в вызываемой процедуре.
Параметр же переданный без атрибута (модификатора) можно менять в вызванной процедуре, но при выходе из процедуры переданный параметр останется неизменным.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
ivan219
Дата 30.10.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Понятно smile 
PM MAIL ICQ   Вверх
digs
Дата 30.10.2006, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 14.10.2006

Репутация: нет
Всего: 1



Цитата(Snowy @  30.10.2006,  02:58 Найти цитируемый пост)
Извлекаем мы всё равно всё те же 4 байта. А дальше всё равно по какому адресу брать значение - скорость та же.

А если Integer извлекаем? При const сначала берем адрес, а по нему берем Integer. Без const берем Integer сразу. Быстрее без const.
Хотя надо еще проверить, может в целях оптимизации const на такие вещи не действует: все равно передается значение.

Это сообщение отредактировал(а) digs - 30.10.2006, 03:46
PM MAIL   Вверх
bems
Дата 30.10.2006, 04:03 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Snowy @  30.10.2006,  00:58 Найти цитируемый пост)
Если const, то физически в процедуру передаётся не значение A, а указатель на исходную переменную
только если тип аргумента не влизает в 4 байта. Иначе передается по значению, но менять все равно нельзя.

Цитата(Snowy @  30.10.2006,  00:58 Найти цитируемый пост)
С точки зрения скорости, не имеет никакого значения, что именно класть в стек - значение или указатель.
А если значение очень длинное?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Snowy
Дата 30.10.2006, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(digs @  30.10.2006,  04:43 Найти цитируемый пост)
 При const сначала берем адрес, а по нему берем Integer
А где хранится Integer? В регистрах? Нет. В памяти - по определённому адресу.
Тут ассемблер нужно знать, чтобы понять smile
Код не работает с переменными - он работает со значениями по адресу в памяти.
Значение: достали из стека - записали по адресу.
Адрес - достали из стека - записали адрес.
Работаем в любом случае с адресом в памяти.
Если процедура на чистом асме - то выбираем как нам удобнее.

Цитата(bems @  30.10.2006,  05:03 Найти цитируемый пост)
только если тип аргумента не влизает в 4 байта. Иначе передается по значению, но менять все равно нельзя.
const всегда передаёт адрес. А указанное тобой поведение - это без указания const.

Цитата(bems @  30.10.2006,  05:03 Найти цитируемый пост)
А если значение очень длинное?
Какое такое "очень длинное?"

Добавлено @ 09:48 
Если под длинным, подразумевается, что не помещается в 4 байта, то передаётся указатель.
Тогда вообще нет разницы.
PM MAIL   Вверх
Yanis
Дата 30.10.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



И всё таки, значение вмещающееся в двойное слово передаётся в функцию непосредственно. Переменная размер которой больше чем двойное слово - передаётся по указателю smile
Я согласен с высказываением bems
Цитата(bems @  30.10.2006,  05:03 Найти цитируемый пост)
только если тип аргумента не влизает в 4 байта.


А вот, что касаетсяименения аргумента, то тут нужно уточнить дабы не допустить путаницы у менее опытных. Как таковое, значение переданное const нельзя изменять, но это легко обходится, т.к. Delphi "защищает" значение на уровне типов. Следственно получив указатель мы можем делать с значением переданным нам в функции всё что угодно.

Код

type
  TX = record
    x, y: DWORD;
  end;

{ ... }

procedure p(const P: TX);
var
  pOnTX: ^TX;
begin
  pOnTX := @P;
  pOnTX^.x := 11;
  ShowMessage('p: ' + IntToStr(pOnTX^.x));
end;

var
  x1: TX;
begin
  x1.x := 10;
  p(x1);
end;


Это сообщение отредактировал(а) Yanis - 30.10.2006, 11:24


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Snowy
Дата 30.10.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Yanis @  30.10.2006,  12:21 Найти цитируемый пост)
Я согласен с высказываением bems
А я нет.
При указании const всегда будет передаваться по указателю.
Даже если это Integer или byte.
PM MAIL   Вверх
Fedia
Дата 30.10.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Цитата(Yanis @  30.10.2006,  11:21 Найти цитируемый пост)
Как таковое, значение переданное const нельзя изменять, но это легко обходится

Не знал о такой возможности, но зачем может понадобиться сначала накладывать ограничения, объявляя параметр функции с атрибутом const, а затем обходить свое же ограничение с использованием указателей ?


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Snowy
Дата 30.10.2006, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Ну так указатели - это способ уйти от стандартов, сделать недоступное доступным, а код более запутанным и неочевидным, чреватым побочными эффектами.
Даже компилятор вам скажет, что использование указателей небезопасно smile
Но, если очень хочется, то можно smile Если конечно ты единственный автор проекта... 
Иначе твои коллеги тебя точно не похвалят за то, что константная процедура меняет данные, которые её не доверяли менять.
PM MAIL   Вверх
vlgr
Дата 30.10.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



Цитата(Snowy @ 30.10.2006,  11:41)
Цитата(Yanis @  30.10.2006,  12:21 Найти цитируемый пост)
Я согласен с высказываением bems
А я нет.
При указании const всегда будет передаваться по указателю.
Даже если это Integer или byte.


Неверно. 
При указании var всегда будет передаваться по указателю.
При указании const если аргумент до 4 байт значение, иначе по указателю. 
PM MAIL   Вверх
Yanis
Дата 30.10.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Fedia @  30.10.2006,  13:05 Найти цитируемый пост)
Не знал о такой возможности, но зачем может понадобиться сначала накладывать ограничения, объявляя параметр функции с атрибутом const, а затем обходить свое же ограничение с использованием указателей ? 

Скажу так: это иногда требуется! Так как иногда требуется воспользоваться закрытым виртуальным методом чужого класса smile

Впечатлило? smile Вот тебе ещё интересный снип smile
Код
const
  x: DWORD = 0;
begin
  PDWORD(Pointer(@X))^ := 1;
  ShowMessage(IntToStr(X));
end;


Добавлено @ 13:47 
Snowy
А ты для какой версии компилятора говоришь? Delphi какая?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1207 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.