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

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

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

Re: break в С++

Сообщение gavrasio »

devilr писал(а):
31.12.2015 23:42
Ага. Сначала ты чуток изучаешь какой-нибудь из простых ЯП. Пишешь на нем простую программу и думаешь, что знаешь все обо всем.
А через 30 лет практики ты знаешь уже 10+ ЯП и точно знаешь, что нифига не знаешь. Классика. :)

Ну, где то так оно и есть. Все мы люди. Сначала радуемся, потом ошибаемся, затем учимся. А затем опять ошибаемся( здесь начинаем спрашивать советы у знающих). А потом опять ошибаемся. А потом приходит истина(!?).
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: break в С++

Сообщение yoshakar »

Bizdelnick писал(а):
31.12.2015 14:58
Ну а про goto я выше уже писал, в этом плане отличий между C и C++ нет.
Всё-таки в C++ в отличие от C есть общеизвестная причина не использовать goto вообще никогда, хотя ТС об этом можно пока не думать.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

yoshakar писал(а):
01.01.2016 01:49
в C++ в отличие от C есть общеизвестная причина не использовать goto вообще никогда

Что за причина? И каковы альтернативы?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: break в С++

Сообщение devilr »

Хм. Оказывается "общеизвестная". Было бы любопытно узнать, какая? Чтобы, так сказать, войти в это общество и повысить кругозор.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: break в С++

Сообщение yoshakar »

Эм, дык деструкторы же.

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

void a() {
goto x;
    MyObject myObject;
x:
  return;
}
int main() {
  a();
  return 0;
}
конструктор MyObject не будет вызван, а деструктор будет.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: break в С++

Сообщение devilr »

А с какой радости деструктор то будет в таком случае вызван? Обьект то еще не создан. Просто обьявление объекта в подобном месте не гарантирует ничего. Если подобный объект был бы описан в каком либо классе, тогда еще ладно. А тут....
P.S. Опять же, даже если компилятор и создаст подобный код, то что с того? Некорректный код - он в любом ЯП некорректный. Вне зависимости от наличия или отсутствия goto.
P.P.S. Сегодня НГ. Уже туго соображается. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: break в С++

Сообщение /dev/random »

yoshakar писал(а):
01.01.2016 02:11
Эм, дык деструкторы же.

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

void a() {
goto x;
    MyObject myObject;
x:
  return;
}
int main() {
  a();
  return 0;
}
конструктор MyObject не будет вызван, а деструктор будет.

И gcc, и clang такой код просто откажутся компилировать.

PS: А вот и подтверждение:
(c++14, 6.7.3) писал(а):It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A
program that jumps91 from a point where a variable with automatic storage duration is not in scope to a
point where it is in scope is ill-formed unless the variable has scalar type, class type with a trivial default
constructor and a trivial destructor, a cv-qualified version of one of these types, or an array of one of the
preceding types and is declared without an initializer (8.5).
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: break в С++

Сообщение yoshakar »

Ну значит починили, но когда-то оно было сломано.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

/dev/random писал(а):
01.01.2016 03:38
yoshakar писал(а):
01.01.2016 02:11
Эм, дык деструкторы же.

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

void a() {
goto x;
    MyObject myObject;
x:
  return;
}
int main() {
  a();
  return 0;
}
конструктор MyObject не будет вызван, а деструктор будет.

И gcc, и clang такой код просто откажутся компилировать.

PS: А вот и подтверждение:
(c++14, 6.7.3) писал(а):It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A
program that jumps91 from a point where a variable with automatic storage duration is not in scope to a
point where it is in scope is ill-formed unless the variable has scalar type, class type with a trivial default
constructor and a trivial destructor, a cv-qualified version of one of these types, or an array of one of the
preceding types and is declared without an initializer (8.5).


Извините меня, уже как то не в тему.Но код Ваш не имеет шапки и здесь мы сидим на g++ , а не на gpp.
gcc у Вас.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: break в С++

Сообщение devilr »

На g++ оно тоже просто так не соберется. Можно обойти ограничения с -fpermessive, но это не то. В том смысле, что пример неудачен и уж точно не показывает "причины не использовать goto"
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: break в С++

Сообщение /dev/random »

gavrasio писал(а):
01.01.2016 21:42
Извините меня, уже как то не в тему.Но код Ваш не имеет шапки и здесь мы сидим на g++ , а не на gpp.

Во-первых, это не мой код. Во-вторых, я имел в виду, что не только конкретно этот код, но и любой код, делающий goto в область видимости инициализируемой (или имеющей конструктор/деструктор) переменной извне этой области, откажется компилироваться. В-третьих, компилятор называется gcc, а g++ - это просто рекомендованный способ вызывать его для C++. Обёртка, по сути.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

devilr писал(а):
01.01.2016 21:51
На g++ оно тоже просто так не соберется. Можно обойти ограничения с -fpermessive, но это не то. В том смысле, что пример неудачен и уж точно не показывает "причины не использовать goto"

Стараемся свои коды показывать и компилировать и опять показывать, что получилось. Так будет по-дружески! Всем будет с Новым Годом!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

gavrasio писал(а):
01.01.2016 21:42
уже как то не в тему

Да начиная с сообщения break в С++ тут вообще ничего в тему не было.

gavrasio писал(а):
01.01.2016 22:24
Стараемся свои коды показывать и компилировать и опять показывать, что получилось.

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

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
01.01.2016 22:34
gavrasio писал(а):
01.01.2016 21:42
уже как то не в тему

Да начиная с сообщения break в С++ тут вообще ничего в тему не было.



Хозин - барин. Вы модератор.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: break в С++

Сообщение devilr »

И, самое главное, зачем? Тему с break, вроде, обсудили. Если ТС все понятно, можно закрыть эту тему и открыть следующую, где и устроить адский холивар о goto, ошибках компилятора и прочих вкусных вещах. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

yoshakar писал(а):
01.01.2016 04:36
Ну значит починили, но когда-то оно было сломано.

Немного тормоз. А то, что сверху, - это к чему?

devilr писал(а):
01.01.2016 22:41
И, самое главное, зачем? Тему с break, вроде, обсудили. Если ТС все понятно, можно закрыть эту тему и открыть следующую, где и устроить адский холивар о goto, ошибках компилятора и прочих вкусных вещах. :)
Всё в Ваших руках.

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

Re: break в С++

Сообщение gavrasio »

devilr писал(а):
01.01.2016 02:05
Хм. Оказывается "общеизвестная". Было бы любопытно узнать, какая? Чтобы, так сказать, войти в это общество и повысить кругозор.

Да!
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: break в С++

Сообщение yoshakar »

gavrasio писал(а):
01.01.2016 22:58
А то, что сверху, - это к чему?
Не обращайте внимания. /dev/random показал что с современными компиляторами и стандартами означенной проблемы не существует.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

devilr писал(а):
31.12.2015 16:09
На специализированных форумах по МК тонкости использования C++ не обсуждаются потому, что на C++ на микроконтроллерах практически не пишут.

Не хочу холиварить, но Вы хотите сказать, что сейчас програмисты сидят в чистом С. По-моему С++ обсуждается со всех сторон, мы его тут полоскаем.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: break в С++

Сообщение devilr »

gavrasio писал(а):
02.01.2016 23:10
devilr писал(а):
31.12.2015 16:09
На специализированных форумах по МК тонкости использования C++ не обсуждаются потому, что на C++ на микроконтроллерах практически не пишут.

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


Я хочу сказать, что тема называется "break в C++". И непосредственно к микроконтроллерам это не имело отношение. В начале. Потом я их зачем то их задел(возможно, в силу специфики профессии). Да, я "сижу в чистом С". Да, у нас С++ используется в основном в "верхних программах". Внизу - чистый С, ну или ассемблер. Просто особенности используемых контроллеров. И я высказал личное мнение. Да, забыл добавить имхо. Но это совсем не относится ни к С ни к С++.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

devilr писал(а):
02.01.2016 23:48
gavrasio писал(а):
02.01.2016 23:10
devilr писал(а):
31.12.2015 16:09
На специализированных форумах по МК тонкости использования C++ не обсуждаются потому, что на C++ на микроконтроллерах практически не пишут.

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


Я хочу сказать, что тема называется "break в C++"Просто особенности используемых контроллеров. И я высказал личное мнение. Да, забыл добавить имхо. Но это совсем не относится ни к С ни к С++.

Добавь! Принимаем все движения. Особенно к С++. Основную тему - не трожь!
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

gavrasio писал(а):
01.01.2016 23:23
devilr писал(а):
01.01.2016 02:05
Хм. Оказывается "общеизвестная". Было бы любопытно узнать, какая? Чтобы, так сказать, войти в это общество и повысить кругозор.

Да!

Вопрос был другой. Ответ был другой.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

devilr писал(а):
02.01.2016 23:48
gavrasio писал(а):
02.01.2016 23:10
devilr писал(а):
31.12.2015 16:09
На специализированных форумах по МК тонкости использования C++ не обсуждаются потому, что на C++ на микроконтроллерах практически не пишут.

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


Я хочу сказать, что тема называется "break в C++". И непосредственно к микроконтроллерам это не имело отношение. В начале. Потом я их зачем то их задел(возможно, в силу специфики профессии). Да, я "сижу в чистом С". Да, у нас С++ используется в основном в "верхних программах". Внизу - чистый С, ну или ассемблер. Просто особенности используемых контроллеров. И я высказал личное мнение. Да, забыл добавить имхо. Но это совсем не относится ни к С ни к С++.

Просто break сделал, когда обрыв цепи.

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

//Вольтметр на АЦП, вход на 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);
 }
}

Это я к тому, зачем оно мне надо!

Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: break в С++

Сообщение devilr »

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

Re: break в С++

Сообщение gavrasio »

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

Согласен. Надо дать информацию, почему я вышел. Это поправимо. Просто я дал сырой код. Но он работает. Делаю эксперименты над ним. Так и познаю С++.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

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

Есть другой вариант:

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

#include<avr/io.h>
#include<util/delay.h>
#include <avr/interrupt.h>
extern void lcd_com(unsigned char p);   //Ввод команд ЖКИ
extern void lcd_dat(unsigned char p);   //Ввод данных ЖКИ
extern void lcd_init(void);           //Инициализация ЖКИ
extern void pause(long int p);    //"p" - длительность паузы

  unsigned long a=0; unsigned long b=0;

ISR (ADC_vect)
{           // lcd_dat(0x01);
         // pause ( 50000);

    //lcd_init ( );
    a = ADCW;
    a = a*5000/1024;
    //pause(10000);
    lcd_com(0xC4);
    //pause ( 10000);
    lcd_dat (a/1000+ 0x30);
    lcd_dat ( ',' );
    lcd_dat ((a/100)%10 + 0x30);
    lcd_dat ((a/10)%10 + 0x30);
    lcd_dat (a%10 + 0x30);
             pause ( 5000);
         ADCSRA |= 0x40;
}

int main ( void )
{
PORTB = DDRD = 0xFF;  PORTC = 0xF8; // 0b11111000
 DDRC = 0x05; // 0b00000101
          lcd_init ( );
    ADMUX = 0b01000001;  //|REFS1|REFS0|ADLAR| -- |MUX3|MUX2|MUX1|MUX0|
    ADCSR= 0b11001011;  //|ADEN|ADSC|ADFR|ADIF|ADIE|ADPS2|ADPS1|ADPS0|
   sei (  );
 while(1);
  }

Но, здесь я даже боюсь где-то ставить break.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: break в С++

Сообщение devilr »

А вот здесь, кстати, выход из прерывания (а ISR и есть оно) ничего страшного не принесет. В обработчике прерывания важно долго не задерживаться. А ранний выход совсем не страшен.
Задержка (или зацикливание) в прерывании чревато тем, что в момент обработки такого прерывания может произойти еще одно. Или несколько. И все закончится срывом стека. И, если собака не покусает - все зависнет. Или перейдет в неопределенное состояние. Что не лучше. Совсем.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

devilr писал(а):
03.01.2016 20:45
Задержка (или зацикливание) в прерывании чревато тем, что в момент обработки такого прерывания может произойти еще одно.

The AVR hardware clears the global interrupt flag in SREG before entering an interrupt vector. Thus, normally interrupts will remain disabled inside the handler until the handler exits, where the RETI instruction (that is emitted by the compiler as part of the normal function epilogue for an interrupt handler) will eventually re-enable further interrupts. For that reason, interrupt handlers normally do not nest.
http://www.nongnu.org/avr-libc/user-manual...ts.html#details
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
03.01.2016 21:16
devilr писал(а):
03.01.2016 20:45
Задержка (или зацикливание) в прерывании чревато тем, что в момент обработки такого прерывания может произойти еще одно.

The AVR hardware clears the global interrupt flag in SREG before entering an interrupt vector. Thus, normally interrupts will remain disabled inside the handler until the handler exits, where the RETI instruction (that is emitted by the compiler as part of the normal function epilogue for an interrupt handler) will eventually re-enable further interrupts. For that reason, interrupt handlers normally do not nest.
http://www.nongnu.org/avr-libc/user-manual...ts.html#details

Спасибо, за информацию. Я тоже давненько просматриваю полную версию avr-libc-user-manual.
Из прерываний( это только для МК) сделать выход по Сишному нельзя, проверено. И из других функций - тоже. А для чистого С++ - всё, что разрешено, то можно.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

Что есть «выход по-сишному»?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить