|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
Есть функция: Код: pascal 1. 2. 3. 4. 5. 6.
вызов с параметром работает Код: pascal 1. 2. 3. 4.
вызов без не работает :) Код: pascal 1. 2. 3. 4.
Можно как-то заделать или перегрузкой? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 08:14 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
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; ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 09:16 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
antox, PString(nil)^ ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 09:39 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
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.
вот что вывелось Код: pascal 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 12:08 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
antoxМожно как-то заделать или перегрузкой? Лучше перегрузкой. Параметры по ссылке специально были придуманы чтобы в них нельзя было передать "ничего". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 12:31 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
Соколинский Борис antox, PString(nil)^ Спасибо, работает :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 12:50 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
antox Соколинский Борис antox, PString(nil)^ Спасибо, работает :) @(nil)^ - универсальный вариант. Но лучше не злоупотреблять. Если это твой код - добавь перегрузку. Если чужой - ты не можешь гарантировать, что функция пережует такой ввод. К примеру, она может безусловно занулять параметр и лишь потом проверять другие. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 13:55 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
antox, Не надо никаких хаков, указателей и других извратов. Объявить локальную переменную S:string и передавать туда. За указатели в таких местах - гнать из професии. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 14:52 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
swame2 Не надо никаких хаков, указателей и других извратов. Объявить локальную переменную S:string и передавать туда. За указатели в таких местах - гнать из професии. Это точно программист ответствует? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 17:05 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
wadman Это точно программист ответствует? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 17:13 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
wadman, если про меня, то опыт паскаль / дельфи > 35 лет. Я не про указатели вообще, сам их очень даже использую там, где они к месту. А тут явный изврат только для того, чтобы показать что они знают, как это делается. Такие эмоции, потому что не далее как вчера помогал вычищать подобное говно менее опытному коллеге, который с этим корячился несколько часов с кодом, в которым тоже были когда то созданы проблемы на ровном месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 17:35 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
swame2 если про меня, то опыт паскаль / дельфи > 35 лет. 35 лет и вместо рабочего примера ушат помоев. Да и "локальная переменная" - вообще чудо. В функции/процедуре? В её локальную переменную? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 17:37 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
wadman, Рабочий пример уже был в исходном сообщении, вторым по счету, я на это и указал. Да, это называется локальная переменная. В вызывающей фунции. Н.Вирт "Язык паскаль". Я такое изучал в 9 классе в 1984 году, а в ответах на исходное пошел какой-то трэш про то что нужно учить указатели и хаки, за которые в рабочем коде надо пороть. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 18:14 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal antox пропущено... Спасибо, работает :) @(nil)^ - универсальный вариант. Но лучше не злоупотреблять. Если это твой код - добавь перегрузку. Если чужой - ты не можешь гарантировать, что функция пережует такой ввод. К примеру, она может безусловно занулять параметр и лишь потом проверять другие. Код мой, но перегрузка добавит кучу ненужного кода и непонятно, какой в этом смысл ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 05:21 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
swame2 antox, Не надо никаких хаков, указателей и других извратов. Объявить локальную переменную S:string и передавать туда. За указатели в таких местах - гнать из професии. Чем не нравится? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 05:22 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
Может есть какие-то другие, менее затратные, способы вернуть несколько значений из функции? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 05:24 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
antox Может есть какие-то другие, менее затратные, способы вернуть несколько значений из функции? Вернуть запись и использовать только нужные поля?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 09:32 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
antox Может есть какие-то другие, менее затратные, способы вернуть несколько значений из функции? менее затратные по сравнению с чем. В чём затраты измеряются? Если затраты измеряются с тактах CPU, то наименее затратный способ: объявить record и в нем описать необходимые поля. Если затраты изменяются в объёме работы программиста (в том числе на отладку), то менее затратный: использовать SuperObjects (правда, в него не завезли многие типы данных), либо (внимание! реклама!) модуль ParamsUtils.pas . Использование вариантов я считаю более затратным, т.к. слишком легко ошибиться с индексом параметра и очень сложно отлаживать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 09:43 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
DmSer Хм, объявлять параметры по именам руками, без Code Completion, без контроля ошибок... Экономия времени программиста налицо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 09:46 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
alekcvp DmSer Хм, объявлять параметры по именам руками, без Code Completion, без контроля ошибок... Экономия времени программиста налицо. Так в Delphi кроме record и Variant ничего встроенного нету. На каждый случай объявлять новый record - то ещё удовольствие! От Variant вообще тошнит! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 09:52 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
DmSer На каждый случай объявлять новый record - то ещё удовольствие! Вообще не вижу проблемы. Весь WinAPI на этом построен. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 10:20 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
Жаль, что даже с новыми инлайн переменными нельзя так сделать Код: pascal 1. 2. 3.
или даже так Код: pascal 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 10:27 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
antox swame2 antox, Не надо никаких хаков, указателей и других извратов. Объявить локальную переменную S:string и передавать туда. За указатели в таких местах - гнать из професии. Чем не нравится? А за что мы боролись? За сокращение длины кода? В результате нагородили забор из указателей вместо объявления одной однобуквенной переменной. Это твой пример элементарный, а в рабочем коде таких параметров будет скорее всего несколько, и все это будет нечитаемо + при может измениться число параметров, а вариант с указателем уже будет указывать на другу переменную, скомпеидится, а потом будет падать, причем это место может сразу не обнаружиться. Это как раз тот вариант конструкций, про который в С говорят "выстрел в ногу" ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 11:01 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal Жаль, что даже с новыми инлайн переменными нельзя так сделать или даже так [/src] Не понимаю чем плохо заполнить значения рекордов в паре строчек перед вызовом функции. Все понятно и читаемо. А так все в одной строке - макаронине, при рефакторинге и сравнении версий изменений боль при разборе какой параметр на каком месте и не перепутали ли порядок. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 11:07 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
alekcvp antox Может есть какие-то другие, менее затратные, способы вернуть несколько значений из функции? Вернуть запись и использовать только нужные поля?.. Я предпочитаю именно этот способ. Преимущества: 1. Очень часто набор параметров передается по цепочке методов. В моем проекте например, добавление нового параметра в цепочку вызовов могло повлечь изменения в сотнях виртуальных методов, в десятках модулей. Никому этим заниматься не хотелось, поэтому у разработчиков при необходимости был соблазн использовать нехорощие костыли, типа передачи через глобальную переменную, или использование какого-нибудь малоиспользуемого параметра в разных контекстах для разных параметров, с надеждой , что они не пересекутся. В варианте с записью просто добавляем новое поле, заполняем где надо и вот оно уже везде в цепочке. 2. При наличии большого числа параметров в вызове при рефакторинге легко запутаться в порядке параметров, особенно если они однотипные, и как я уже писал. в сотнях методов, и набор и порядок параметров может быть разный, с каждым разбираться. 3. Скорость. запись почти всегда передается по ссылке как const или var. Что будет много объявлений записей проблем не вижу, если нормально продумать, можно использовать одно объявление для нескольких схожих контекстов, не страшно если есть лишние поля, на скорость не влияет. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 11:24 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
alekcvp DmSer Хм, объявлять параметры по именам руками, без Code Completion, без контроля ошибок... Экономия времени программиста налицо. Неистово плюсую ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 11:28 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
record надо же объявить... Делаю так, если надо много значений вывести. Но частенько надо true/false + значение в примитивном типе. Хотелось бы вернуть что-то типа смешанного кортежа или пусть даже простой (лучше ассоциативный) массив ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 11:32 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
swame2 Не понимаю чем плохо заполнить значения рекордов в паре строчек перед вызовом функции. Все понятно и читаемо. А так все в одной строке - макаронине, при рефакторинге и сравнении версий изменений боль при разборе какой параметр на каком месте и не перепутали ли порядок. Не плохо, просто сахар и сокращение визуального шума. Вообще львиная доля фич любого современного языка - это сахар, без которого можно обойтись. Код: pascal 1. 2. 3. 4. 5. 6. 7.
Код: pascal 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 11:39 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal, Да, вторая конструкция выглядит лучше, и согласен, если она предшествует вызову, а не находится внутри него, тогда она не противоречит тому о чем написал. Еще лучше было бы, если бы ее можно было убрать в секцию объявления переменных, а не кода. Я для такой инициализации обычно использую псевдоконструктор записи. Но там проблемка если параметров больше 2-4 - как я писал - с количеством параметров уже в конструкторе ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 11:56 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
antox record надо же объявить... Делаю так, если надо много значений вывести. Но частенько надо true/false + значение в примитивном типе. Хотелось бы вернуть что-то типа смешанного кортежа или пусть даже простой (лучше ассоциативный) массив В чем проблема объявить record? при необходимости можно использовать и вложенные. Не нужны для этого случая кортежи, поверь. потом будут лишние сложности в поддержке кода. Нужен максимально строгий контроль компилятором типа параметров. Вот тут предложили типа кортежа в ParamUtils. Я сам баловался таким псевдообобщением лет 20 назад, потом все это оказалось пшиком. Но там это было более оправдано, потому что объекты протаскивались через COM объкектную модель, а там добавить параметр в устоявшийся код на 2 порядка сложней, чем добавить параметр в рекорд. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 12:03 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
alekcvp DmSer На каждый случай объявлять новый record - то ещё удовольствие! Вообще не вижу проблемы. Весь WinAPI на этом построен. Согласен. Я неверно описал цели ParamsUtils. Основная фишка не в том, что с его помощью можно вернуть несколько параметров, а в том, что можно вернуть произвольное количество параметров (либо передать в функцию произвольное количество параметров). А в этом случае к параметром удобнее всего обращаться по именам. Удобно использовать при организации взаимодействия между модулями (например при передаче данных из EXE в DLL), когда заранее все возможные параметры не предусмотришь. Это в 100 раз удобнее, чем использовать голый Variant. При использовании record можно добиться такой же цели, но нужно передавать через указатель и в самом начале предусмотреть номер версии либо размер. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 12:51 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
DmSer alekcvp пропущено... Вообще не вижу проблемы. Весь WinAPI на этом построен. Согласен. Я неверно описал цели ParamsUtils. Основная фишка не в том, что с его помощью можно вернуть несколько параметров, а в том, что можно вернуть произвольное количество параметров (либо передать в функцию произвольное количество параметров). А в этом случае к параметром удобнее всего обращаться по именам. Удобно использовать при организации взаимодействия между модулями (например при передаче данных из EXE в DLL), когда заранее все возможные параметры не предусмотришь. Это в 100 раз удобнее, чем использовать голый Variant. При использовании record можно добиться такой же цели, но нужно передавать через указатель и в самом начале предусмотреть номер версии либо размер. Конечно, передавать record между EXE в DLL не годится. Мне часто приходится передавать данные и между двумя exe. Мое решение на это случай - одинаковый record ( или объекты) на стороне EXE в DLL, при передаче он сериализуется в строку, например через JSON. Обращение внутри каждого модуля к типизированным полям рекорда. Добавление параметра делается в 1 месте, где описан рекорд и его сериализация. Ваш ParamsUtils тоже можно использовать для сериалзициии, но для этого, как я понимаю, кода будет не меньше чем c JSON, но с JSON стандартней и быстрее. И можно передавать сколь угодно сложные структуры. Мой подход частично взят с идей Remoting SDK (старой версии, без RTTI) https://www.remotingsdk.com/ro/default.aspx. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 13:11 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
swame2 DmSer пропущено... Согласен. Я неверно описал цели ParamsUtils. Основная фишка не в том, что с его помощью можно вернуть несколько параметров, а в том, что можно вернуть произвольное количество параметров (либо передать в функцию произвольное количество параметров). А в этом случае к параметром удобнее всего обращаться по именам. Удобно использовать при организации взаимодействия между модулями (например при передаче данных из EXE в DLL), когда заранее все возможные параметры не предусмотришь. Это в 100 раз удобнее, чем использовать голый Variant. При использовании record можно добиться такой же цели, но нужно передавать через указатель и в самом начале предусмотреть номер версии либо размер. Конечно, передавать record между EXE в DLL не годится. Мне часто приходится передавать данные и между двумя exe. Мое решение на это случай - одинаковый record ( или объекты) на стороне EXE в DLL, при передаче он сериализуется в строку, например через JSON. Обращение внутри каждого модуля к типизированным полям рекорда. Добавление параметра делается в 1 месте, где описан рекорд и его сериализация. Ваш ParamsUtils тоже можно использовать для сериалзициии, но для этого, как я понимаю, кода будет не меньше чем c JSON, но с JSON стандартней и быстрее. И можно передавать сколь угодно сложные структуры. Мой подход частично взят с идей Remoting SDK (старой версии, без RTTI) https://www.remotingsdk.com/ro/default.aspx. Расскажи подробнее, как гоняешь данные м-ду приложениями ч-з json? Через что передаешь и как информируешь приложение о поступлении данных? Гоняешь м-ду двумя приложениями или всегда есть промежуточный приложение-сервер? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 13:28 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
swame2 Еще лучше было бы, если бы ее можно было убрать в секцию объявления переменных, а не кода. Да, локальные переменные почему-то нельзя так инитить, а было бы хорошо. С другой стороны, константные иниты локальных переменных - дело редкое, а переменные в ините язык вряд ли когда-то будет поддерживать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 13:39 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
antox, Между DLL и приложением обмениваюсь через небольшой надор экспортированных фуккий. Даныне передаются в виде пакетов конада (это имя метода) + параметры. Это все упаковывается по спецификации JSON RPC. https://ru.wikipedia.org/wiki/JSON-RPC Между приложениями, в т.ч. по сети, такие же пакеты JSON + бинарные блоки ходят через транспорт ZeroMQ https://zeromq.org Архитектура используется разнае, и клиент - сервер, и точка - точка ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 13:47 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
antox record надо же объявить... Делаю так, если надо много значений вывести. Но частенько надо true/false + значение в примитивном типе. Хотелось бы вернуть что-то типа смешанного кортежа или пусть даже простой (лучше ассоциативный) массив Код: pascal 1. 2. 3. 4. 5.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 13:49 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
swame2 Да, это называется локальная переменная. В вызывающей фунции. Не хотелось-бы поучать, все таки 35 лет стажа, но локальная переменная это то, что объявлено внутри блока. Что пришло из вне - в данном контексте не является локальной переменной. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 13:54 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
wadman, Я и имел в виду под локальной эту r объявленную внутри блока. Код: pascal 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 13:59 |
|
Как не передавать ничего в параметр по ссылке?
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal antox record надо же объявить... Делаю так, если надо много значений вывести. Но частенько надо true/false + значение в примитивном типе. Хотелось бы вернуть что-то типа смешанного кортежа или пусть даже простой (лучше ассоциативный) массив Код: pascal 1. 2. 3. 4. 5.
? Не надо тут ничего обобщать через дженерики. Сделай простые типизированные рекорды. Я за дженерики и очень даже использую. Но тут они не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 14:07 |
|
|
start [/forum/topic.php?all=1&fid=58&tid=2037098]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 174ms |
0 / 0 |