Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как не передавать ничего в параметр по ссылке? / 25 сообщений из 39, страница 1 из 2
18.08.2021, 08:14
    #40091390
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
Есть функция:

Код: pascal
1.
2.
3.
4.
5.
6.
function myf(s: string; var res: string): boolean;
begin
  
  if assigned(res) then res := s;

end;



вызов с параметром работает

Код: pascal
1.
2.
3.
4.
var
  r: string;
begin
  myf('Строка', r);



вызов без не работает :)

Код: pascal
1.
2.
3.
4.
var
  r: string;
begin
  myf('Строка', nil);



Можно как-то заделать или перегрузкой?
...
Рейтинг: 0 / 0
18.08.2021, 09:16
    #40091393
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
antox,

указатели
function TForm1.myf(s: Pointer; var res: String): boolean;
var
st:^string;
begin
st:=s;
if s <> nil
then begin
res:=st^;
result:=True;
end
else Result:=False

end;

procedure TForm1.Button1Click(Sender: TObject);
var
s:String;
begin
if myf(nil, s)
then ShowMessage(s);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
s, s1:String;
begin
s1:='hjgjhghjg';
if myf(@s1, s)
then ShowMessage(s);
end;
...
Рейтинг: 0 / 0
18.08.2021, 09:39
    #40091395
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
antox,
PString(nil)^
...
Рейтинг: 0 / 0
18.08.2021, 12:08
    #40091441
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
antox,

с указателями точно можно

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
//Delphi 6

//-----------------------------------------
procedure myf(s: string; res: PString);
begin
   if assigned(res) then
      res^ := s;
end;

//-----------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
   s     : string;
   res   : string;
begin
   s := '111';
   res := '??????';
   myf(s, @res);
   Memo1.Lines.Add(res);


   s := '222';
   res := '???????';
   myf(s, nil);
   Memo1.Lines.Add(res);
end;



вот что вывелось
Код: pascal
1.
2.
111
???????
...
Рейтинг: 0 / 0
18.08.2021, 12:31
    #40091450
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
antoxМожно как-то заделать или перегрузкой?

Лучше перегрузкой. Параметры по ссылке специально были придуманы чтобы в них нельзя было
передать "ничего".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.08.2021, 12:50
    #40091454
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
Соколинский Борис
antox,
PString(nil)^


Спасибо, работает :)
...
Рейтинг: 0 / 0
18.08.2021, 13:55
    #40091489
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
antox
Соколинский Борис
antox,
PString(nil)^


Спасибо, работает :)

@(nil)^ - универсальный вариант. Но лучше не злоупотреблять. Если это твой код - добавь перегрузку. Если чужой - ты не можешь гарантировать, что функция пережует такой ввод. К примеру, она может безусловно занулять параметр и лишь потом проверять другие.
...
Рейтинг: 0 / 0
18.08.2021, 14:52
    #40091514
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
antox,

Не надо никаких хаков, указателей и других извратов. Объявить локальную переменную S:string и передавать туда.
За указатели в таких местах - гнать из професии.
...
Рейтинг: 0 / 0
18.08.2021, 17:05
    #40091561
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
swame2
Не надо никаких хаков, указателей и других извратов. Объявить локальную переменную S:string и передавать туда.
За указатели в таких местах - гнать из професии.

Это точно программист ответствует?
...
Рейтинг: 0 / 0
18.08.2021, 17:13
    #40091570
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
wadman
Это точно программист ответствует?
это школьник.
...
Рейтинг: 0 / 0
18.08.2021, 17:35
    #40091576
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
wadman,

если про меня, то опыт паскаль / дельфи > 35 лет.
Я не про указатели вообще, сам их очень даже использую там, где они к месту.
А тут явный изврат только для того, чтобы показать что они знают, как это делается.
Такие эмоции, потому что не далее как вчера помогал вычищать подобное говно менее опытному коллеге,
который с этим корячился несколько часов с кодом, в которым тоже были когда то созданы проблемы на ровном месте.
...
Рейтинг: 0 / 0
18.08.2021, 17:37
    #40091578
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
swame2
если про меня, то опыт паскаль / дельфи > 35 лет.

35 лет и вместо рабочего примера ушат помоев.

Да и "локальная переменная" - вообще чудо. В функции/процедуре? В её локальную переменную?
...
Рейтинг: 0 / 0
18.08.2021, 18:14
    #40091584
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
wadman,

Рабочий пример уже был в исходном сообщении, вторым по счету, я на это и указал.
Да, это называется локальная переменная. В вызывающей фунции.
Н.Вирт "Язык паскаль".
Я такое изучал в 9 классе в 1984 году,
а в ответах на исходное пошел какой-то трэш про то что нужно учить указатели и хаки, за которые в рабочем коде надо пороть.
...
Рейтинг: 0 / 0
19.08.2021, 05:21
    #40091651
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
Fr0sT-Brutal
antox
пропущено...


Спасибо, работает :)

@(nil)^ - универсальный вариант. Но лучше не злоупотреблять. Если это твой код - добавь перегрузку. Если чужой - ты не можешь гарантировать, что функция пережует такой ввод. К примеру, она может безусловно занулять параметр и лишь потом проверять другие.


Код мой, но перегрузка добавит кучу ненужного кода и непонятно, какой в этом смысл
...
Рейтинг: 0 / 0
19.08.2021, 05:22
    #40091652
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
swame2
antox,

Не надо никаких хаков, указателей и других извратов. Объявить локальную переменную S:string и передавать туда.
За указатели в таких местах - гнать из професии.


Чем не нравится?
...
Рейтинг: 0 / 0
19.08.2021, 05:24
    #40091653
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
Может есть какие-то другие, менее затратные, способы вернуть несколько значений из функции?
...
Рейтинг: 0 / 0
19.08.2021, 09:32
    #40091676
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
antox
Может есть какие-то другие, менее затратные, способы вернуть несколько значений из функции?

Вернуть запись и использовать только нужные поля?..
...
Рейтинг: 0 / 0
19.08.2021, 09:43
    #40091680
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
antox
Может есть какие-то другие, менее затратные, способы вернуть несколько значений из функции?


менее затратные по сравнению с чем. В чём затраты измеряются?
Если затраты измеряются с тактах CPU, то наименее затратный способ: объявить record и в нем описать необходимые поля.
Если затраты изменяются в объёме работы программиста (в том числе на отладку), то менее затратный: использовать SuperObjects (правда, в него не завезли многие типы данных), либо (внимание! реклама!) модуль ParamsUtils.pas . Использование вариантов я считаю более затратным, т.к. слишком легко ошибиться с индексом параметра и очень сложно отлаживать.
...
Рейтинг: 0 / 0
19.08.2021, 09:46
    #40091682
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
DmSer

Если затраты изменяются в объёме работы программиста
ParamsUtils.pas .

Хм, объявлять параметры по именам руками, без Code Completion, без контроля ошибок... Экономия времени программиста налицо.
...
Рейтинг: 0 / 0
19.08.2021, 09:52
    #40091685
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
alekcvp
DmSer

Если затраты изменяются в объёме работы программиста
ParamsUtils.pas .

Хм, объявлять параметры по именам руками, без Code Completion, без контроля ошибок... Экономия времени программиста налицо.


Так в Delphi кроме record и Variant ничего встроенного нету. На каждый случай объявлять новый record - то ещё удовольствие! От Variant вообще тошнит!
...
Рейтинг: 0 / 0
19.08.2021, 10:20
    #40091699
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
DmSer
На каждый случай объявлять новый record - то ещё удовольствие!

Вообще не вижу проблемы. Весь WinAPI на этом построен.
...
Рейтинг: 0 / 0
19.08.2021, 10:27
    #40091701
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
Жаль, что даже с новыми инлайн переменными нельзя так сделать
Код: pascal
1.
2.
3.
  var si: TStartupInfo := (cb: 0);
  var pi: TProcessInformation := (cb: 0);
  CreateProcess(nil, nil, nil, nil, true, 0, nil, nil, si, pi);


или даже так
Код: pascal
1.
  CreateProcess(nil, nil, nil, nil, true, 0, nil, nil, (cb: 0), (cb: 0));
...
Рейтинг: 0 / 0
19.08.2021, 11:01
    #40091711
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
antox
swame2
antox,

Не надо никаких хаков, указателей и других извратов. Объявить локальную переменную S:string и передавать туда.
За указатели в таких местах - гнать из професии.


Чем не нравится?


А за что мы боролись?
За сокращение длины кода? В результате нагородили забор из указателей вместо объявления одной однобуквенной переменной.
Это твой пример элементарный, а в рабочем коде таких параметров будет скорее всего несколько, и все это будет нечитаемо +
при может измениться число параметров, а вариант с указателем уже будет указывать на другу переменную, скомпеидится, а потом будет падать, причем это место может сразу не обнаружиться. Это как раз тот вариант конструкций, про который в С говорят "выстрел в ногу"
...
Рейтинг: 0 / 0
19.08.2021, 11:07
    #40091715
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
Fr0sT-Brutal
Жаль, что даже с новыми инлайн переменными нельзя так сделать
или даже так
[/src]


Не понимаю чем плохо заполнить значения рекордов в паре строчек перед вызовом функции.
Все понятно и читаемо. А так все в одной строке - макаронине, при рефакторинге и сравнении версий изменений боль при
разборе какой параметр на каком месте и не перепутали ли порядок.
...
Рейтинг: 0 / 0
19.08.2021, 11:24
    #40091731
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не передавать ничего в параметр по ссылке?
alekcvp
antox
Может есть какие-то другие, менее затратные, способы вернуть несколько значений из функции?

Вернуть запись и использовать только нужные поля?..


Я предпочитаю именно этот способ.
Преимущества:
1. Очень часто набор параметров передается по цепочке методов. В моем проекте например, добавление нового параметра в цепочку вызовов могло повлечь изменения в сотнях виртуальных методов, в десятках модулей. Никому этим заниматься не хотелось, поэтому у разработчиков при необходимости был соблазн использовать нехорощие костыли, типа передачи через глобальную переменную, или использование какого-нибудь малоиспользуемого параметра в разных контекстах для разных параметров, с надеждой , что они не пересекутся.
В варианте с записью просто добавляем новое поле, заполняем где надо и вот оно уже везде в цепочке.
2. При наличии большого числа параметров в вызове при рефакторинге легко запутаться в порядке параметров, особенно если они однотипные, и как я уже писал. в сотнях методов, и набор и порядок параметров может быть разный, с каждым разбираться.
3. Скорость. запись почти всегда передается по ссылке как const или var.

Что будет много объявлений записей проблем не вижу, если нормально продумать, можно использовать одно объявление для нескольких схожих контекстов, не страшно если есть лишние поля, на скорость не влияет.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как не передавать ничего в параметр по ссылке? / 25 сообщений из 39, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]