Ну, где то так оно и есть. Все мы люди. Сначала радуемся, потом ошибаемся, затем учимся. А затем опять ошибаемся( здесь начинаем спрашивать советы у знающих). А потом опять ошибаемся. А потом приходит истина(!?).
break в С++ (Выход из функции)
Модератор: Модераторы разделов
Re: break в С++
Ну, где то так оно и есть. Все мы люди. Сначала радуемся, потом ошибаемся, затем учимся. А затем опять ошибаемся( здесь начинаем спрашивать советы у знающих). А потом опять ошибаемся. А потом приходит истина(!?).
Re: break в С++
Всё-таки в C++ в отличие от C есть общеизвестная причина не использовать goto вообще никогда, хотя ТС об этом можно пока не думать.Bizdelnick писал(а): ↑31.12.2015 14:58Ну а про goto я выше уже писал, в этом плане отличий между C и C++ нет.
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: break в С++
Что за причина? И каковы альтернативы?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: break в С++
Хм. Оказывается "общеизвестная". Было бы любопытно узнать, какая? Чтобы, так сказать, войти в это общество и повысить кругозор.
Re: break в С++
Эм, дык деструкторы же.
конструктор MyObject не будет вызван, а деструктор будет.
Код: Выделить всё
void a() {
goto x;
MyObject myObject;
x:
return;
}
int main() {
a();
return 0;
}
Re: break в С++
А с какой радости деструктор то будет в таком случае вызван? Обьект то еще не создан. Просто обьявление объекта в подобном месте не гарантирует ничего. Если подобный объект был бы описан в каком либо классе, тогда еще ладно. А тут....
P.S. Опять же, даже если компилятор и создаст подобный код, то что с того? Некорректный код - он в любом ЯП некорректный. Вне зависимости от наличия или отсутствия goto.
P.P.S. Сегодня НГ. Уже туго соображается.
P.S. Опять же, даже если компилятор и создаст подобный код, то что с того? Некорректный код - он в любом ЯП некорректный. Вне зависимости от наличия или отсутствия goto.
P.P.S. Сегодня НГ. Уже туго соображается.
- /dev/random
- Администратор
- Сообщения: 5289
- ОС: Gentoo
Re: break в С++
yoshakar писал(а): ↑01.01.2016 02:11Эм, дык деструкторы же.
конструктор MyObject не будет вызван, а деструктор будет.Код: Выделить всё
void a() { goto x; MyObject myObject; x: return; } int main() { a(); return 0; }
И 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).
Спасибо сказали:
Re: break в С++
Ну значит починили, но когда-то оно было сломано.
Re: break в С++
/dev/random писал(а): ↑01.01.2016 03:38yoshakar писал(а): ↑01.01.2016 02:11Эм, дык деструкторы же.
конструктор MyObject не будет вызван, а деструктор будет.Код: Выделить всё
void a() { goto x; MyObject myObject; x: return; } int main() { a(); return 0; }
И 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 у Вас.
Re: break в С++
На g++ оно тоже просто так не соберется. Можно обойти ограничения с -fpermessive, но это не то. В том смысле, что пример неудачен и уж точно не показывает "причины не использовать goto"
- /dev/random
- Администратор
- Сообщения: 5289
- ОС: Gentoo
Re: break в С++
Во-первых, это не мой код. Во-вторых, я имел в виду, что не только конкретно этот код, но и любой код, делающий goto в область видимости инициализируемой (или имеющей конструктор/деструктор) переменной извне этой области, откажется компилироваться. В-третьих, компилятор называется gcc, а g++ - это просто рекомендованный способ вызывать его для C++. Обёртка, по сути.
Re: break в С++
Стараемся свои коды показывать и компилировать и опять показывать, что получилось. Так будет по-дружески! Всем будет с Новым Годом!
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: break в С++
Да начиная с сообщения break в С++ тут вообще ничего в тему не было.
Кхм... Вы приходите, показываете код, спрашиваете, почему он не работает, Вам отвечают. Какие такие коды должны показывать и компилировать все остальные?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: break в С++
Bizdelnick писал(а): ↑01.01.2016 22:34
Да начиная с сообщения break в С++ тут вообще ничего в тему не было.
Хозин - барин. Вы модератор.
Re: break в С++
И, самое главное, зачем? Тему с break, вроде, обсудили. Если ТС все понятно, можно закрыть эту тему и открыть следующую, где и устроить адский холивар о goto, ошибках компилятора и прочих вкусных вещах.
Re: break в С++
Немного тормоз. А то, что сверху, - это к чему?
Всё в Ваших руках.
Re: break в С++
Не обращайте внимания. /dev/random показал что с современными компиляторами и стандартами означенной проблемы не существует.
Re: break в С++
Не хочу холиварить, но Вы хотите сказать, что сейчас програмисты сидят в чистом С. По-моему С++ обсуждается со всех сторон, мы его тут полоскаем.
Re: break в С++
Я хочу сказать, что тема называется "break в C++". И непосредственно к микроконтроллерам это не имело отношение. В начале. Потом я их зачем то их задел(возможно, в силу специфики профессии). Да, я "сижу в чистом С". Да, у нас С++ используется в основном в "верхних программах". Внизу - чистый С, ну или ассемблер. Просто особенности используемых контроллеров. И я высказал личное мнение. Да, забыл добавить имхо. Но это совсем не относится ни к С ни к С++.
Re: break в С++
devilr писал(а): ↑02.01.2016 23:48
Я хочу сказать, что тема называется "break в C++"Просто особенности используемых контроллеров. И я высказал личное мнение. Да, забыл добавить имхо. Но это совсем не относится ни к С ни к С++.
Добавь! Принимаем все движения. Особенно к С++. Основную тему - не трожь!
Re: break в С++
devilr писал(а): ↑02.01.2016 23:48
Я хочу сказать, что тема называется "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);
}
}
Это я к тому, зачем оно мне надо!
Re: break в С++
Главное потом не забыть, зачем там именно break.Тем более, что в данном примере, такой break приведет к выходу из функции main и улет в неизвестном направлении - за пределами main то жизни нет (в компьютере управление бы вернулось в операционную систему, а тут ее нет). И только великий пес по имени watchdog может оживить все
Re: break в С++
devilr писал(а): ↑03.01.2016 18:42Главное потом не забыть, зачем там именно break.Тем более, что в данном примере, такой break приведет к выходу из функции main и улет в неизвестном направлении - за пределами main то жизни нет (в компьютере управление бы вернулось в операционную систему, а тут ее нет). И только великий пес по имени watchdog может оживить все
Согласен. Надо дать информацию, почему я вышел. Это поправимо. Просто я дал сырой код. Но он работает. Делаю эксперименты над ним. Так и познаю С++.
Re: break в С++
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.
Re: break в С++
А вот здесь, кстати, выход из прерывания (а ISR и есть оно) ничего страшного не принесет. В обработчике прерывания важно долго не задерживаться. А ранний выход совсем не страшен.
Задержка (или зацикливание) в прерывании чревато тем, что в момент обработки такого прерывания может произойти еще одно. Или несколько. И все закончится срывом стека. И, если собака не покусает - все зависнет. Или перейдет в неопределенное состояние. Что не лучше. Совсем.
Задержка (или зацикливание) в прерывании чревато тем, что в момент обработки такого прерывания может произойти еще одно. Или несколько. И все закончится срывом стека. И, если собака не покусает - все зависнет. Или перейдет в неопределенное состояние. Что не лучше. Совсем.
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: break в С++
http://www.nongnu.org/avr-libc/user-manual...ts.html#detailsThe 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.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: break в С++
Bizdelnick писал(а): ↑03.01.2016 21:16
http://www.nongnu.org/avr-libc/user-manual...ts.html#detailsThe 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.
Спасибо, за информацию. Я тоже давненько просматриваю полную версию avr-libc-user-manual.
Из прерываний( это только для МК) сделать выход по Сишному нельзя, проверено. И из других функций - тоже. А для чистого С++ - всё, что разрешено, то можно.
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: break в С++
Что есть «выход по-сишному»?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |