Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2021, 19:37   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 623
По умолчанию var const в параметрам

Несколько вопросов
Читал в одной из статей, что var перед переменной означает что переменная не будет копироваться, а будет работать как ссылка и процедура будет воздействовать напрямую на глобальную переменную (или переменную более старшей процедуры)
Тем самым ускоряя вызов процедуры, не занимая лишнюю память

1. В случае с const тоже идет не копирование переменной, а ссылка на переменную?

2. Как это работает, есть вместо переменной задана формула?
procedure qqq (const s:string);
Вызов
qqq(s1+s2);

Оно таки создает дополнительную переменную в памяти, куда пишет s1+s2, или каждый раз будет вычислять s1+s2

2.1. Тот же вопрос, если вводится функция
Вызов
qqq(f1(s1));

3. Если же в качестве параметра используется часть объекта, то как тогда это работает?
procedure qqq (const f: Tfont);
Вызов
qqq(fontDialog.font);

Работает как ссылка, или же копируется, создавая лишнюю копию в памяти?
Kronos913 вне форума Ответить с цитированием
Старый 29.04.2021, 20:39   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Запустил такой тест:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure q1 (s:string);
begin
  writeln('s: ', Integer(@s));
end;

procedure q2 (const s:string);
begin
  writeln('const s: ', Integer(@s));
end;

procedure q3 (var s:string);
begin
  writeln('var s: ', Integer(@s));
end;

var s: string;
begin
  s:='Hello, World';
  writeln('Addr: ', Integer(@s));
  q1(s);
  q2(s);
  q3(s);
  readln;
end.
Результат:
Код:
Addr: 4292216
s: 1638240
const s: 1638240
var s: 4292216
Вывод - параметр, который передается как const, создает копию переменной, но в самой функции нельзя менять значение этой копии. То есть он не по ссылке передается.
Arigato вне форума Ответить с цитированием
Старый 29.04.2021, 20:45   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Однако для массивов результат уже другой:
Код:
type tmyarr=array[1..5] of integer;

procedure q1 (s:tmyarr);
begin
  writeln('s: ', Integer(@s));
end;

procedure q2 (const s:tmyarr);
begin
  writeln('const s: ', Integer(@s));
end;

procedure q3 (var s:tmyarr);
begin
  writeln('var s: ', Integer(@s));
end;

var s: tmyarr;
begin
  s[1]:=14; s[2]:=6; s[3]:=-10; s[4]:=0; s[5]:=2;
  writeln('Addr: ', Integer(@s));
  q1(s);
  q2(s);
  q3(s);
  readln;
end.
Массив const передает по ссылке:
Код:
Addr: 4292216
s: 1638236
const s: 4292216
var s: 4292216
Arigato вне форума Ответить с цитированием
Старый 29.04.2021, 21:36   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 623
По умолчанию

Ага, то есть const пользоваться нет никакого смысла, надо все через var тогда делать?

а в случае с объектом что будет?
Kronos913 вне форума Ответить с цитированием
Старый 29.04.2021, 21:39   #5
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
то есть const пользоваться нет никакого смысла, надо все через var тогда делать?
Ну почему же? С массивами передается ссылка, с записями (record) тоже ссылка. Со строками, где указано число символов (string[10]) - ссылка.
Arigato вне форума Ответить с цитированием
Старый 25.05.2021, 13:26   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 623
По умолчанию

Интересно получается
Код:
Function qqq(q:TStrings): integer;
begin
 result:=Integer(@q)
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  d:integer;
begin
 memo1.Lines.Clear;

 d:=Integer(@memo1.Lines);
 Memo1.Lines.Add(IntToStr(d));

 d:=qqq(memo1.Lines);
 Memo1.Lines.Add(IntToStr(d));
end;
И оно выдало разные значения!
Цитата:
36255920
1700804
Получается, TStrings передается не по ссылке...
Kronos913 вне форума Ответить с цитированием
Старый 25.05.2021, 13:55   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
И оно выдало разные значения!
естественно. у вас ДВЕ разных переменных.
@ -- адрес ПЕРЕМЕННОЙ. в которой записан указатель на объект.
и их(переменных) адреса естественно разные.

зачем передавать по ссылке то что и так является ссылкой(УКАЗАТЕЛЕМ).
выведите
1. Pointer(memo1.Lines);
2. Pointer(q);
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изловчиться.... my $var = sub1() || sub2($var); IgorKiev Perl 1 16.10.2018 07:57
С++ Преобразование const Char в const GUID Decoy2k Общие вопросы C/C++ 9 07.02.2012 14:02
какая разница между const var и без ничего в процедуре KpecTHbIi Паскаль, Turbo Pascal, PascalABC.NET 2 11.01.2012 20:37
Var Черничный Общие вопросы Delphi 4 17.07.2008 00:44
var Черничный Общие вопросы Delphi 9 25.06.2008 17:10