|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
13.03.2018, 19:24 | #1 |
Форумчанин
Регистрация: 10.10.2013
Сообщений: 150
|
Точки останова в повторяющихся фрагментах кода
Часто бывает, что один и тот же фрагмент кода повторяется очень много раз в разных участках программы. Чтобы много раз не переписывать один и тот же фрагмент во время его редактирования в Делфи, например, существуют локальные подпрограммы.
Код:
Код:
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
|
13.03.2018, 20:53 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
1)макросы зло, есть шаблоны. + макросы совсем не тоже самое что локальные функции в Делфи.
2)используйте обычные функции, не локальные.(хотя можно через лямбды извратится...) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
13.03.2018, 22:02 | #3 | ||
Форумчанин
Регистрация: 10.10.2013
Сообщений: 150
|
Цитата:
Какие шаблоны? Цитата:
В результате, остаются только макросы, которые, к сожалению, не видит отладчик.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
|
||
13.03.2018, 23:27 | #4 |
Форумчанин
Регистрация: 13.08.2011
Сообщений: 184
|
В С++ есть std::function и лямбды.
В С++ - шаблоны. В Delphi - дженерики. И это скорее всего - хорошо, чем плохо. |
14.03.2018, 18:44 | #6 | |
Форумчанин
Регистрация: 10.10.2013
Сообщений: 150
|
Цитата:
Засунуть все переменные в класс ради кусков кода, а потом обращаться к объекту ради получения доступа к обычной перемеренной... Я уже думал об этом, но в результате получится еще сложнее чем, передать переменные в функции через параметры. Но и этот вариант получится очень громоздким. На Делфи я давно бы уже всё написал. Не раз на нем делал подобное. Но нельзя, ЯП строго С++. Мне не приходилось работать с шаблонами в С++. Ну вот, допустим, я объявил шаблон. Код:
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
|
|
14.03.2018, 18:52 | #7 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Какой еще subprogram? Там имя типа (например T) для использования в этой функции или классе, вместо которого при вызове функции или создании экземпляра класса указывается настоящий тип (для функций бывает автоматически).
Например Код:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
14.03.2018, 19:19 | #8 |
Форумчанин
Регистрация: 24.01.2011
Сообщений: 774
|
Попахивает г*вном.
Суть в том, что для чистого кода характерна модульность и сокрытие того, что происходит "под капотом". Модули должны быть слабо связанными, то есть, количество связей между ними должно быть как можно меньше. Функцию тоже можно рассматривать как модуль. В таком случае, то, что ты не можешь передать в модуль достаточное количество аргументов, говорит о том, что она у тебя сильно связана с остальным кодом. Поясню тебе за интерфейсы. Код:
А вот это: реализация: Код:
Таким образом, отсутствие возможности создания локальных функций связана именно с тем, что для локальной функции как раз характерно то, что вызывающий код вынужден зависеть от реализации этой функции, ведь она имеет возможность менять контекст. Повторяю, твою проблему можно решить с помощью ООП. Суть ООП в том, что объекты инкапсулируют в себе данные и методы их обработки. То есть, тебе надо создать класс, который имеет следующий формат: Код:
Код:
Второй способ выноса локальных функций работает только для C++. У тебя есть .h файл с описанием всех функций. Ты можешь создать более одного cpp файла для него! Хоть по одной на функцию. И в cpp файле делаешь такой код: Код:
Но этот метод достаточно плохой, плюс, он, по сути, является недоООП. Ну, и последний, самый дрянной метод, который сломает мозги тому, кто будет поддерживать твой код, из-за чего этот псих найдёт тебя и зарубит топором. Использование лямбда выражений! Просто пишешь внутри метода: Код:
Важная вещь — квадратные скобки. [a, b, &c] — К обычным аргументам лямбда ещё примет копии a,b и ссылку на c, и сможет это использовать. [=] — функция получит копию всего, что есть в верхней функции. [&] — функция получит ссылку на все переменные, что есть в верхней. Это именно то, что в Delphi, python и т. п. Надеюсь, я тебе прояснил твои возможности.
a.k.a. Angelicos Phosphoros
Мой сайт |
14.03.2018, 19:19 | #9 |
Форумчанин
Регистрация: 10.10.2013
Сообщений: 150
|
Я же говорю, никогда не работал с шаблонами в С++.
Работаю в данный момент со скриптовым языком, аналог С++. Лямбд там нет, std тоже. Работают только шаблоны. Но как их использовать в качестве локальных подпрограмм, понятия не имею и в интернете никакой информации по этому не нашел. Снова вы про него? Ну что за мода, делать такие выводы не зная цели для которой решается задача? Хватит! А то неприятно, аж сюда подванивает.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
|
14.03.2018, 19:24 | #10 |
Форумчанин
Регистрация: 24.01.2011
Сообщений: 774
|
В таком случае у тебя остаётся только два варианта:
1) стиснуть зубы и отрефакторить код так, чтобы он нормально декомпозировался на меньшие функции; 2) писать как есть. Конечно, это же Вы читаете свой код
a.k.a. Angelicos Phosphoros
Мой сайт |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите найти ошибку: *.exe вызвал срабатывание точки останова | Gretchem Waide | Помощь студентам | 2 | 04.11.2014 18:02 |
OllyDbg при срабатывани точки останова окно крэкми вызвать помогите пожалуста! | Dimka-novitsek | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 13 | 11.04.2014 18:57 |
Debug, Отладка завершает программу после точки останова | 3betmebabyImFamous | Общие вопросы по Java, Java SE, Kotlin | 0 | 09.08.2012 15:41 |
[РЕШЕНО] не работают точки останова | VVkSoft | Общие вопросы Delphi | 9 | 31.10.2011 15:16 |
Точки останова | Spot | Общие вопросы Delphi | 8 | 24.07.2010 19:56 |