Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
 Аватар для prosto_lynx
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227

Выполнять определенные действия при любом выходе из функции

25.09.2012, 23:24. Показов 4704. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть функция, в которой ряд ветвлений и return'ов... при этом хотелось бы при каждом return'е выполнять определенные действия (обнуление флагов, освобождение памяти и еще ряд операций).
Как такое грамотнее реализовать?
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.09.2012, 23:24
Ответы с готовыми решениями:

Как не выполнять действия при определенном условии?
программа работает нормально, проблема только в одном при выводе сообщения "неправильно введено значение", она еще выводит сообщения...

Определенные действия при подключении флэшки
if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 ) { char DiskLabel; WORD OldErrorMode; ...

Выполнять действия через определенные интервалы таймера
Нужно считывать информацию с таймера и в соответствии со временем делать клик мышкой. Таймер до ТЫСЯЧНЫХ мсек.:00.00.000сек Пример: в txt...

41
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
27.09.2012, 00:50
Студворк — интернет-сервис помощи студентам
Каюсь, погорячился - действительно байда с этим endloop. Тогда выкидываем его нафиг и пишем условие выхода из цикла на этапе проверки условия for. Получаем то же самое.
C++
1
2
for(y=0; y<Height && (Data[y][x]!=0); y++)
 for(x=0; x<Width && (Data[y][x]!=0); x++);
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
27.09.2012, 01:04
Тоже не вариант.
C++
1
if(Data[y][x]==0)
я написал для простоты, а условие может быть и посложнее с предварительным расчетом, который в for не засунешь. Что тогда?
C++
1
2
3
4
5
6
7
8
9
int y,x; 
for(y=0; y<Height; y++)
{ for(x=0; x<Width; x++)
  { .../// здесь расчет
     if(...) goto EndFind; // все дальше можно не считать
     .../// здесь продолжение расчета
  }
}
EndFind: ...
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
27.09.2012, 08:16
Цитата Сообщение от gumi250 Посмотреть сообщение
Что тогда?
Ваше словоблудие понятно и объяснимо, пока вы пишете детские проекты на коленке в стиле "посчитали и вернулись". Как только дело коснется серьёзных проектов, над которыми работает несколько человек и тестировщики, за такой быдлокод будет очень и очень стыдно. И поверьте, человек, который после будет отлаживать подобный проект, не раз упомянет добрым словом таких горе-оптимизаторов.
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
27.09.2012, 08:42
mimicria, мне стандарт языка предоставил возможность быстро прервать цикл в цикле (через goto). Ваш вариант замены одного goto на 10E6 условий, конечно является верхом крутости, остроумия и вам за него не стыдно.
1
 Аватар для prosto_lynx
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
27.09.2012, 23:15  [ТС]
Цитата Сообщение от Day Посмотреть сообщение

Не по теме:


Друзья! Вам не кажется, что мы вступаем на тропу "священной войны"... :)

Не по теме:

Прошу прощения за столь "кровавый" топик... сам даже не ожидал...))



Цитата Сообщение от UI Посмотреть сообщение
В самом крайнем случае можно обернуть всё тело функции в try {здесь тело функции} /__finally {действия при выходе}, тогда перед выходом по return-у выполнится то, что записано в блоке __finally. Но это - костыль.
А почему "в самом крайнем случае"? Мне, на первый взгляд, это даже изящно показалось...

Цитата Сообщение от nick42 Посмотреть сообщение
Если в функции множество ветвлений, то резонно в самом начале определить переменную (скажем - steps), которой в каждой ветви присваивается некое значение. А при завершении обработки эта переменная анализируется (типа swich - case... снова ветвление )
Но, а если, при определенных результатах все остальные действия выполнять нельзя?

Цитата Сообщение от BRcr Посмотреть сообщение
Вопрос на засыпку: а почему вообще в функции много return'ов оказалось? Потому что либо при ветвлении функция должна возвращать различные значения, либо возвращать она ничего не должна, а автор просто не умеет работать с условиями или циклами. В первом случае нужно модифицировать возвращаемое значение в зависимости от ветвлений и в конце возвращать его один раз, выполняя при этом некие побочные действия. Во втором - выпрямлять руки.
1) Функция возвращает значение (хоть и всего лишь булево), но условий для его формирования очень много...
2) Вот именно "выпрямлением рук" я и занимаюсь с вашей любезной помощью)

P.S.

Не по теме:

Постарался наиболее просто и без лишнего представить мою функцию и понял, что

одна из проблем, создавшая мне трудности в том, что я читаю из потока.
А протокол чтения таков, что если в какой-то момент прочитали не ту информацию или чтение не прошло, то функция должна завершиться и вернуть false...

Например такой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool func()
{
 if (!good_read()) //Читаем из файла или внешнего устройства
  return false;
/*Вычисления №1*/
 if (!good_read())
  return false;
/*Вычисления №2*/
 if (!good_read())
  return false;
/*Вычисления №3*/
.........
 return true;
}
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
28.09.2012, 09:48
Цитата Сообщение от prosto_lynx Посмотреть сообщение
Например такой пример:
Такой пример легко преобразуется к такому:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool func()
{
 bool result=false;
 if (good_read()) //Читаем из файла или внешнего устройства
 {
  /*Вычисления №1*/
  if (good_read())
  {
   /*Вычисления №2*/
   if (good_read())
   {
    /*Вычисления №3*/
    .........
    result=true;
   }
  }
 }
 return (result);
}
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
28.09.2012, 10:27
Такой пример легко преобразуется к такому:....
О да, это леко читаемо и мега удобно иметь в "Вычисления №3" три дополнительных отступа, а если условий if (good_read()) не 3 а 5 или 7. А если Вычисления №3 довольно сложны и сами по себе содержат кучу вложений. Что в итоге будет? Будет целая тьма скобок и отступов. Нет уж по мне лучше куча ретурнов.
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
28.09.2012, 10:33
Цитата Сообщение от gumi250 Посмотреть сообщение
Будет целая тьма скобок и отступов. Нет уж по мне лучше куча ретурнов
Это ваше мнение, которое имеет право на жизнь. Я считаю его неверным и моё мнение тоже имеет право на жизнь. На этом предлагаю остановиться. Некоторым людям доказывать что-то абсолютно бесполезно .
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
28.09.2012, 11:03
Господа, позвольте вас рассудить. Вы говорите об одном и том же, только в профиль.
mimicria, рассуждает с точки зрения "хорошего стиля программирования". Это бесспорно замечательно и красиво. Особенно, когда ты делаешь действительно громоздкие проекты, которые потом будут просматривать другие люди. А вот только когда не делаешь, весь хороший стиль программирования на фик не нужен. Пишешь там какую-нибудь лабораторную, - сдал ее и гори она огнем. Mimicria конечно скажет, что надо сразу все писать хорошо. Но это каждый сам решает для себя.
Но у метода gumi250 есть один бесспорный плюс, который так и не нравится Mimicria - возможность выхода из функции в любом месте. Ведь если смотреть с другой стороны - ресурсы. Не нужно просчитывать, что находится после return.
1
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
28.09.2012, 14:06
Цитата Сообщение от mimicria Посмотреть сообщение
Это ваше мнение, которое имеет право на жизнь. Я считаю его неверным и моё мнение тоже имеет право на жизнь. На этом предлагаю остановиться. Некоторым людям доказывать что-то абсолютно бесполезно .
Конечно у каждого может быть собственное мнение. Но чтобы кому то что то доказать нужны аргументы. Конечно и я за хороший стиль, но что уж до маразма все доводить - любой ценой без goto и 1 return. Надо быть гибким и подстраиваться под ситуацию.
  • Если с goto код будет работать быстрее я его ставлю.
  • Если ф-ция со сложной логикой и мне нужно прыгнуть в начало ф-ции я поставлю goto и не буду тратить время раздумывая, а можно ли сделать это же без goto.
  • Если мне нужно при входе в ф-цию проверить флаг (если флаг занят то сразу выйти) или проверить входящие параметры, то я поставлю return-ы, а не буду тянуть кучу отступов через всю ф-цию. По мне гораздо удобней в начале ф-ции увидеть проверку с return, чем мотать несколько страниц кода до конца ф-ции (ф-ции бывают оч длинные) и отслеживать нужный отступ, чтобы увидеть закрытие скобки в конце ф-ции.
  • Если ф-ция имеет много вложенных скобок и отступов, то я не буду их еще искусственно увеличивать отказом от доп. return-ов, т.к. потом сложно искать скобке пару.
А какие аргументы есть у вас?
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
28.09.2012, 14:45
Цитата Сообщение от gumi250 Посмотреть сообщение
Надо быть гибким
И я тоже за гибкость в программировании; ведь ясно же, что одну и ту же программу можно создать десятком способов и это зависит от опыта программиста. Если речь идет о стиле программирования, то, конечно, можно выделить приоритеты, которых начинающему программисту стоит придерживаться. Но программирование не терпит "табу" на отдельные приемы и способы; все зависит от конкретной ситуации. Если неопытный программист, в силу ограниченности программистского кругозора, задействует несколько десятков таймеров или везде будет ставить goto (ему так проще, возможно), то я считаю этот подход не правильным, даже если его программа будет отвечать своей задаче. Но если этим goto воспользуется программист, умеющий обходиться и другими средствами - это его полное право и я даже советовать ничего не рискну... .
2
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
02.10.2012, 22:37
Цитата Сообщение от gumi250 Посмотреть сообщение
Если ф-ция со сложной логикой и мне нужно прыгнуть в начало ф-ции я поставлю goto и не буду тратить время раздумывая, а можно ли сделать это же без goto.
А вот это, ИМХО, действительно опасно. Запутывает напрочь логику программы. Знаю на собственной шкурке. И сам был грешен, и чужие программки разбирал - головная боль от этого немыслимая. Уж лучше пару отступов.
Во всем остальном с вами совершенно согласен.
2
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
02.10.2012, 22:55
Против таких приемов (goto и аналогичное) у меня только одно предостережение, - в случае с ассемблерным кодом такие переходы еще опаснее, особенно если программа сложная и емкая в понятии объема текста. Но там это все выверяется и, в конце концов, - ассемблер - это машинный язык, все на виду. А работая в среде Билдера, который при обработке так или иначе трактует текст программера, оптимизирует его, - рискованно делать этакие "заячьи петли", - можно нарваться..., или "черная дыра" в адресном пространстве, или еще чего похуже.
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
03.10.2012, 02:39
Цитата Сообщение от Байт Посмотреть сообщение
А вот это, ИМХО, действительно опасно. Запутывает напрочь логику программы. Знаю на собственной шкурке. И сам был грешен, и чужие программки разбирал - головная боль от этого немыслимая. Уж лучше пару отступов.
Во всем остальном с вами совершенно согласен.
Вы абсолютно правы. Но тут дело уже не в экономии отступов, а в сложности самой ф-ции. Когда хочется без goto, но как это сделать не совсем понятно, т.к. сама логика может быть очень запутаной. Возможно даже после долгих раздумий, потратив время, вы придете к выводу, что без goto вообще не получится.
Как то мне было нужно написать одну сложную ф-цию, вроде все продумал написал. Начал отлаживать, естественно нашлись упущенные моменты (всего не предусмотришь). Начал править, но со скобками сразу не получалось поправить (при исправлении каждой ошибки переписывать всю ф-цию тоже не очень здорово), поэтому начал ставить goto (хотя бы на период отладки). Отладил вроде. И что теперь? Тут 2 варианта. 1-оставить рабочий код с goto, 2-все переделать возможно уменьшив число goto (и продолжить отладку ошибок появившихся уже после переписывания). Я сильно не заморачиваясь оставил как есть. Спустя некоторое время, мне нужно было еще дополнить эту ф-ция, и я использовал в ней goto.
К чему это я. А к тому что одно дело теория, а другое дело практика. Конечно хочется красиво и без goto, но на практике, лично у меня, так не всегда получается. Готовы ли вы тратить дополнительное время на снижение числа goto? Лично я не всегда. Переписывать рабочий код с goto я точно не буду. Иногда мне с goto проще и быстрее. Но это абсолютно единичные случаи!!!
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.10.2012, 06:52

Не по теме:

gumi250, в твоей точке зрения мне непонятна лишь неприязнь к отступам и вложенности условий. На глаз не нравится или ручками править влом?:)
В последнем случае могу отрекомендовать Formatter в составе RAD Studio - все правки кода делаются как два пальца обоссфальт, сам я на него подсел уже давно и надолго...


nick42, а на что конкретно можно нарваться при оптимизации goto? Что за черная дыра?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.10.2012, 07:08
А если Вычисления №3 довольно сложны и сами по себе содержат кучу вложений.
То эти вычисления следовало бы поместить в отдельную ф-цию или объект

А вообще я так и не понял чем здесь аргументоровано использование goto.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
03.10.2012, 07:12
Цитата Сообщение от gumi250 Посмотреть сообщение
А к тому что одно дело теория, а другое дело практика. Конечно хочется красиво и без goto, но на практике, лично у меня, так не всегда получается. Готовы ли вы тратить дополнительное время на снижение числа goto? Лично я не всегда.
лично мне за 15 лет сидения на С ни разу не приходил в голову алгоритм с goto
несколько ретурнов это нормально в одном вернуть одно значение в другом другое,разбить функции на подфункции

Но все меняется когда сажусь за ассемблер(особенно для микроконтроллеров) там без джампов(сиречь гото) очень трудно
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
03.10.2012, 13:30
gumi250, в твоей точке зрения мне непонятна лишь неприязнь к отступам и вложенности условий. На глаз не нравится или ручками править влом?
За Formatter спасибо, надо попробовать, но у меня раньше был похожий самописный эксперт. Сейчас стоит эксперт, выделяешь участок кода и жмешь Ctrl+Alt+Left(Right) и участок кода перемещается на пробел влево (вправо), это оказалось много удобней. У билдера есть встроенная такая фишка, но там какое то адское сочетание клавиш. От пробелов стоит эксперт CnPack, он для дельфи, но у с++ тоже рисует вертикальные цветные линии от скобки открытия к скобке закрытия, тоже оказалось удобно. Просто если стоит проверка и тут же ретурн, то код ретурном как бы разбивается на фрагменты, а если скобки в скобки, то код как бы монолитный. Фрагментарный код легче для понимания.

лично мне за 15 лет сидения на С ни разу не приходил в голову алгоритм с goto
Выше я приводил пример как прервать цикл в цикле, куда уж банальнее.

А если Вычисления №3 довольно сложны и сами по себе содержат кучу вложений.
То эти вычисления следовало бы поместить в отдельную ф-цию или объект
На мой взгляд в отдельные ф-ции надо выносить повторющееся действия. Если действие используется 1 раз, то какой смысл выносить его в отдельную ф-цию?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.10.2012, 19:05
На мой взгляд в отдельные ф-ции надо выносить повторющееся действия. Если действие используется 1 раз, то какой смысл выносить его в отдельную ф-цию?
Что бы зделать программу логичной и более удобочитаемой, ну смотреть в будующее на расширение и повторное использование
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
03.10.2012, 19:15
Цитата Сообщение от gumi250 Посмотреть сообщение
Если действие используется 1 раз, то какой смысл выносить его в отдельную ф-цию?
Вот именно чтобы сделать программу читабельнее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2012, 19:15

Написать автотест, который будет выполнять определенные действия
Здравствуйте! В общем такая тема, на работе сильно требуют знания С# и выдали задачку для освоения. Я понимаю, кому то покажется смешным и...

Как можно заставить программу выполнять определенные действия после нажатия клавиши ENTER
кто-нибудь может подсказать!! я новенький в VB и почти ни какого опыта программирования в этой среде поэтому столкнулся вот с такой ...

При любом изменении содержимого richTextBox выполнять определенный код
Здравствуйте. Как на с# сделать так, что бы при любом действии (например, добавления символа в richTextBox, удаления символа из...

Определенные действия программы при разрыве сети
Как сделать так, что бы при сбои сети, к примеру, когда связь розорвата, а я пытаюсь что то отправить не выводило ошибку, а просто...

Макрос, который будет выполнять определенные вычисления по базе данных
Нужна помощь в написании макроса, который будет выполнять определенные вычисления по базе данных. Например, статистический отчет, или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru