break в С++ (Выход из функции)

Модератор: Модераторы разделов

gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
07.01.2016 22:50
Что есть «выход по-сишному»?

Я имел ввиду, что выход из функций типа "break" в С++ не такие, как в avr-g++, допустим, для прерываний. Хотя, если копнуть глубже, то выход из прерываний на уровне компиляции без break, наверное, не обойдётся.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

По выход из прерываний всё написано там же:

Код: Выделить всё

#define reti()

Returns from an interrupt routine, enabling global interrupts.

Если выйти просто по return, то прерывания останутся выключенными.
Но вообще, как правило, хитрая логика с несколькими точками выхода в обработчиках прерываний не используется. Они делаются максимально короткими, чтобы не пропустить следующее событие, по которому должно произойти прерывание.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
07.01.2016 23:54
По выход из прерываний всё написано там же:

Код: Выделить всё

#define reti()

Returns from an interrupt routine, enabling global interrupts.

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

Не видел программ с использованием reti(). Если бы не Вы, даже не услышал бы об этом. Хотя это уже и попахивает оффтопиком, но ссылку на код дадите?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

Нет.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
08.01.2016 00:47
Нет.

Да, Вы правы! Учебники надо читать внимательно. reti() - это ассемблеровская команда. А с Ассмом я не дружу, - потому эту команду и не видел.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

devilr писал(а):
03.01.2016 18:42
Главное потом не забыть, зачем там именно break.Тем более, что в данном примере, такой break приведет к выходу из функции main и улет в неизвестном направлении - за пределами main то жизни нет (в компьютере управление бы вернулось в операционную систему, а тут ее нет). И только великий пес по имени watchdog может оживить все :)

По-моему в моём коде:

Код: Выделить всё

//Вольтметр на АЦП, вход на PC1, библиотека для ЖКИ из Интернета.
#include<avr/io.h>
#include<util/delay.h>
#include <avr/interrupt.h>
#include "lcd_lib.h"
#include <avr/pgmspace.h>
  long int a=0;

int main ( void )
{
PORTB = DDRD = 0xFF;  PORTC = 0b00000010;
DDRC =  0b11111101;
   ADMUX = 0b01000001;  //|REFS1|REFS0|ADLAR| -- |MUX3|MUX2|MUX1|MUX0|
                                       //опорное Vref=напр. питания, вход PC1
    ADCSR= 0b11001011;  //|ADEN|ADSC|ADFR|ADIF|ADIE|ADPS2|ADPS1|ADPS0|
                                         //однократное преобразование ADFR=0
          lcd_init();
    lcd_clr();  // без очистки дисплея сбоит
  lcd_gotoxy(1,0);
  lcd_string("==VOLTMETER==",13);
  lcd_gotoxy(10,1);
lcd_string("Volt",4);
  while(1)
{         ADCSRA |= 0x40; //запускаем однократное преобразование ADSC=1
_delay_ms(2);  //пауза обязательно, без неё сбоит
    a=ADCW;
    a = (a*5000/1024);  //Vref=5000(напряжение питания)
    lcd_gotoxy(4,1);
       lcd_dat (a/1000 + 0x30);
    if (a==0)
    break;
    lcd_dat ( ',' );
    lcd_dat ((a/100)%10 + 0x30);
    lcd_dat ((a/10)%10 + 0x30);
    lcd_dat (a%10 + 0x30);
                         _delay_ms(1);
}
}

оператор break не даёт вылет из main, а возвращается в неё для дальнейших движений.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: break в С++

Сообщение devilr »

Оператор break не волшебный. И делает ровно то, на что рассчитывался. А "возврат в функцию main" может быть из-за того, что (например) контроллер, после выхода из функции main, попадает на инструкции, которые для него "не страшные". Т.е. не зацикливающие его. Допустим, на инструкции NOP вплоть до конца адресного пространства. И он шагает по памяти до переполнения адресного регистра. Потом попадает на адрес 0 и все начинает работать как обычно.
И я бы в этом случае, не бреаком вылетал из программы, а рисовал бы на экране тест, показывающий, что же именно произошло и зацикливался. Ну, либо в том же цикле ждал бы восстановления питания. Либо посылал бы sms админу сей девайсины. Или придумал бы еше 100500 вариантов развития событий. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

devilr писал(а):
19.01.2016 23:24
Оператор break не волшебный. И делает ровно то, на что рассчитывался. А "возврат в функцию main" может быть из-за того, что (например) контроллер, после выхода из функции main, попадает на инструкции, которые для него "не страшные". Т.е. не зацикливающие его. Допустим, на инструкции NOP вплоть до конца адресного пространства. И он шагает по памяти до переполнения адресного регистра. Потом попадает на адрес 0 и все начинает работать как обычно.
И я бы в этом случае, не бреаком вылетал из программы, а рисовал бы на экране тест, показывающий, что же именно произошло и зацикливался. Ну, либо в том же цикле ждал бы восстановления питания. Либо посылал бы sms админу сей девайсины. Или придумал бы еше 100500 вариантов развития событий. :)

Я просто хотел сказать, что если бы я после блока wile(1){} поставил бы return(0); - я бы вышел из main, - а так как его нет, то я по-идее остаюсь в main.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: break в С++

Сообщение devilr »

По-идее, или нет - надо смотреть отладчиком. :)
Теоритически, сам компилятор может добавить некую "суперпетлю" и вообще не выпустить из main. Тут сложно сказать, что именно будет происходить не собирая сам код. Вариантов может быть много, а гадать - дело неблагородное. Особенно при наличии дебаггера.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

devilr писал(а):
20.01.2016 00:03
По-идее, или нет - надо смотреть отладчиком. :)
Теоритически, сам компилятор может добавить некую "суперпетлю" и вообще не выпустить из main. Тут сложно сказать, что именно будет происходить не собирая сам код. Вариантов может быть много, а гадать - дело неблагородное. Особенно при наличии дебаггера.

Замер напряжения по коду:

Изображение
Делаю обрыв цепи( в старшем разряде ноль)
Изображение
Удаляю разрыв
Изображение
Программа продолжает работать.
Хотя с этим мне надо уходить с этой темы.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

gavrasio писал(а):
19.01.2016 23:06
оператор break не даёт вылет из main

Вы издеваетесь, что ли? Вся тема посвящена тому, что он этого не делает и делать не может. Неужели до Вас до сих пор не дошло?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
20.01.2016 01:04
gavrasio писал(а):
19.01.2016 23:06
оператор break не даёт вылет из main

Вы издеваетесь, что ли? Вся тема посвящена тому, что он этого не делает и делать не может. Неужели до Вас до сих пор не дошло?

Я просто хотел ответить на замечание от devilr
Главное потом не забыть, зачем там именно break.Тем более, что в данном примере, такой break приведет к выходу из функции main и улет в неизвестном направлении - за пределами main то жизни нет (в компьютере управление бы вернулось в операционную систему, а тут ее нет). И только великий пес по имени watchdog может оживить все
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Читал книги, нашёл такое. Типа аналог выхода из функции.
try
{}
catch
{ что-то делаем}
catch
{ выходим из функции}
Некоторые пользователи пишут, что этим многие злоупотребляют.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

devilr писал(а):
19.01.2016 23:24
Оператор break не волшебный. И делает ровно то, на что рассчитывался. А "возврат в функцию main" может быть из-за того, что (например) контроллер, после выхода из функции main, попадает на инструкции, которые для него "не страшные". Т.е. не зацикливающие его. Допустим, на инструкции NOP вплоть до конца адресного пространства. И он шагает по памяти до переполнения адресного регистра. Потом попадает на адрес 0 и все начинает работать как обычно.
И я бы в этом случае, не бреаком вылетал из программы, а рисовал бы на экране тест, показывающий, что же именно произошло и зацикливался. Ну, либо в том же цикле ждал бы восстановления питания. Либо посылал бы sms админу сей девайсины. Или придумал бы еше 100500 вариантов развития событий. :)

Здесь с Вами согласен. Компилятор avr-g++ сделает выход из программы( из main). Потому, что он компилятор AVR. Я это перепробывал. А симулятор я просто запускаю вручную. Компилятор avr-g++ не есть g++, - у него свои прибамбасы, - об этом Вы, наверное, и хотели мне сказать.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: break в С++

Сообщение devilr »

gavrasio писал(а):
30.01.2016 01:25
Читал книги, нашёл такое. Типа аналог выхода из функции.
try
{}
catch
{ что-то делаем}
catch
{ выходим из функции}
Некоторые пользователи пишут, что этим многие злоупотребляют.

Это не выход из функции, а обработка исключительных ситуаций. Если правильно применить - код программы становится нагляднее.
А злоупотребить можно многим. Особенно, когда только начинаешь программировать. Натыкаешься на подобный обработчик и настолько им восхищаешься, что начинаешь его использовать и там, где можно было сделать и проще. Мастерство приходит с годами. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX
Контактная информация:

Re: break в С++

Сообщение Olej »

gavrasio писал(а):
30.01.2016 02:59
Здесь с Вами согласен. Компилятор avr-g++ сделает выход из программы( из main). Потому, что он компилятор AVR. Я это перепробывал. А симулятор я просто запускаю вручную. Компилятор avr-g++ не есть g++, - у него свои прибамбасы, - об этом Вы, наверное, и хотели мне сказать.

Да прекратите вы (все!) это ... издевательство над присутствующими и насмешкку над самим собой! :crazy:
break - это break,
return - это return,
это элементарнейшие конструкции языков C и C++, простейшие ... с чётко оговоренными и весьма ограниченными синтаксическими правилами.

Выдумать себе "по мотивам" по этому поводу можно чего угодно...
Только выдуманое всё это остаётся пустым соплежевательством! :cray:

Сколько же можно по элементарнейшему вопросу разводить сопли и вопли на 5 страниц форума.
Пока вы не вычитали Букварь - нечего соваться к письму тестов, пока вы не вычитали правила языка - нечего соваться к обсуждению. :angry:

P.S. Вот так прийдёт в тему кто-то ... кто ещё не твёрдо себя чувствует C/C++, и так и не поймёт, что это 5 страниц дерьма, без смыслу и толку. И будет введен в заблуждение, начнёт читать это взаправду и всерьёз!
Не 1-е же апреля пока ещё...
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

devilr писал(а):
30.01.2016 14:11
Если правильно применить - код программы становится нагляднее.

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

devilr писал(а):
30.01.2016 14:11
А злоупотребить можно многим. Особенно, когда только начинаешь программировать. Натыкаешься на подобный обработчик и настолько им восхищаешься, что начинаешь его использовать и там, где можно было сделать и проще.

Вот уж было б чем восхищаться... Такое многобуквие городить без нужды мало кому захочется. Чем злоупотребляют — так это throw. Его-то вставить недолго, особенно если не задумываться о том, сколько потом обработчиков потребуется писать.

Нет, исключения бывают полезны, но только тогда, когда происходит что-то совсем непредвиденное. Например в месте кода, в которое логически попасть нельзя (например в каком-нибудь switch...default, когда все допустимые варианты перебраны в case), бывает полезно вставить throw. И ловить его особой необходимости нет, пусть себе падает, чем громче — тем лучше. Произошло исключение — значит у нас ошибка в коде, надо срочно исправлять. Но некоторые взяли моду кидать исключения, если, скажем, не удалось открыть файл или подключиться к серверу. Что ж тут исключительного? Совершенно нормальная ситуация, причина ошибки — за пределами программы, в неподконтрольном ей жестоком внешнем мире, и ничем кидаться не нужно, а нужно смириться и пытаться как-то жить дальше.
Это если отвлечься от темы микроконтроллеров. А если вернуться к ней, то ни-ка-ких исключений! Вообще! Компилировать с -fno-exceptions. Иначе никаких ресурсов не хватит.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Olej писал(а):
30.01.2016 14:55
gavrasio писал(а):
30.01.2016 02:59
Здесь с Вами согласен. Компилятор avr-g++ сделает выход из программы( из main). Потому, что он компилятор AVR. Я это перепробывал. А симулятор я просто запускаю вручную. Компилятор avr-g++ не есть g++, - у него свои прибамбасы, - об этом Вы, наверное, и хотели мне сказать.

Да прекратите вы (все!) это ... издевательство над присутствующими и насмешкку над самим собой! :crazy:
break - это break,
return - это return,
это элементарнейшие конструкции языков C и C++, простейшие ... с чётко оговоренными и весьма ограниченными синтаксическими правилами.

.

Вы забыли указать ещё, как выйти из while(1) через командную строку. Выйти быстро.
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX
Контактная информация:

Re: break в С++

Сообщение Olej »

gavrasio писал(а):
30.01.2016 19:48
Вы забыли указать ещё, как выйти из while(1) через командную строку. Выйти быстро.

Форум - не для того, чтобы пересказывать Букварь :console:

Какой while? какая командная строка? - вы прежде научитесь термины употреблять в их общеуптребимом смысле. ОК?

Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Olej писал(а):
30.01.2016 20:16
gavrasio писал(а):
30.01.2016 19:48
Вы забыли указать ещё, как выйти из while(1) через командную строку. Выйти быстро.

Форум - не для того, чтобы пересказывать Букварь :console:

Какой while? какая командная строка? - вы прежде научитесь термины употреблять в их общеуптребимом смысле. ОК?

Примерно так:
В UNIX системах <Ctrl+D>
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

В большинстве командных оболочек UNIX-систем всё, что делает Ctrl+D, это отправляет EOF программе на stdin. Что в результате этого произойдёт — зависит исключительно от кода. Если программа ничего с stdin не читает, то не произойдёт ровным счётом ничего. Так что всё правильно сказано, идите осваивать азбуку.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX
Контактная информация:

Re: break в С++

Сообщение Olej »

gavrasio писал(а):
30.01.2016 20:35
Olej писал(а):
30.01.2016 20:16
gavrasio писал(а):
30.01.2016 19:48
Вы забыли указать ещё, как выйти из while(1) через командную строку. Выйти быстро.

Форум - не для того, чтобы пересказывать Букварь :console:

Какой while? какая командная строка? - вы прежде научитесь термины употреблять в их общеуптребимом смысле. ОК?

Примерно так:
В UNIX системах <Ctrl+D>


Это не "командная строка", сынку, это - конец файла, конец данных, EOF. :drinks:
Если у вас в цикле происходит чтение из входного потока (терминал, файл, сокет, ...), то как только read() вернёт вам 0 - вот это есть EOF ... а вы тут-же - break из цикла чтения.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
30.01.2016 21:03
В большинстве командных оболочек UNIX-систем всё, что делает Ctrl+D, это отправляет EOF программе на stdin. Что в результате этого произойдёт — зависит исключительно от кода. Если программа ничего с stdin не читает, то не произойдёт ровным счётом ничего. Так что всё правильно сказано, идите осваивать азбуку.

Прежде чем написать , я перерыл азбуку. Своими словами я бы это не сказал. Но и так я этим пользуюсь в консоли, когда у меня зависает программа.


Olej писал(а):
30.01.2016 21:15
gavrasio писал(а):
30.01.2016 20:35
Olej писал(а):
30.01.2016 20:16
gavrasio писал(а):
30.01.2016 19:48
Вы забыли указать ещё, как выйти из while(1) через командную строку. Выйти быстро.

Форум - не для того, чтобы пересказывать Букварь :console:

Какой while? какая командная строка? - вы прежде научитесь термины употреблять в их общеуптребимом смысле. ОК?

Примерно так:
В UNIX системах <Ctrl+D>


Это не "командная строка", сынку, это - конец файла, конец данных, EOF. :drinks:
Е

Я имел ввиду работу в консоли.
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX
Контактная информация:

Re: break в С++

Сообщение Olej »

gavrasio писал(а):
30.01.2016 21:24
Прежде чем написать , я перерыл азбуку. Своими словами я бы это не сказал. Но и так я этим пользуюсь в консоли, когда у меня зависает программа.

Этим пользоваться когда зависает программа - без толку!
Когда зависает программа, пользуются Ctrl+C.
Похоже ... да не то :ohmy:

- Вы слышали? Говорят Изя Шниферсон выиграл в лотерю 100 рублей...
- Ну ... не 1000, а 3000, и не в лотерею, а в преферанс, и не выиграл, а проиграл.


А если вас интересует прерывание работы программы, Ctrl+C ... и други весёлые консольные комбинации - читайте про сигналы UNIX.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Olej писал(а):
30.01.2016 23:54
А если вас интересует прерывание работы программы, Ctrl+C ... и други весёлые консольные комбинации - читайте про сигналы UNIX.

Читаю. Ctrl+Z. тоже катит, но там свои ньюансы.
Спасибо сказали:
Ответить