powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как не передавать ничего в параметр по ссылке?
25 сообщений из 39, страница 1 из 2
Как не передавать ничего в параметр по ссылке?
    #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
Как не передавать ничего в параметр по ссылке?
    #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
Как не передавать ничего в параметр по ссылке?
    #40091395
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox,
PString(nil)^
...
Рейтинг: 0 / 0
Как не передавать ничего в параметр по ссылке?
    #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
Как не передавать ничего в параметр по ссылке?
    #40091450
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antoxМожно как-то заделать или перегрузкой?

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


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


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

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

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

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

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

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

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

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


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

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


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

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


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

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


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

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

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

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

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


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

Вообще не вижу проблемы. Весь WinAPI на этом построен.
...
Рейтинг: 0 / 0
Как не передавать ничего в параметр по ссылке?
    #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
Как не передавать ничего в параметр по ссылке?
    #40091711
swame2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox
swame2
antox,

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


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


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


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

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


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

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


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