С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 09.03.2011
Сообщений: 18

Подскажите пожалуйста с оператором return во вложенном if

10.09.2015, 18:20. Показов 878. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Подскажите пожалуйста... есть такой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (ManFlags & bHEADER_RCV)
    {           
        if (ByteCounter == 0)
        {   
            uint8_t Invert = ~ManIdentifier [0];
            if (ByteIn != ManIdentifier [0])
                if (ByteIn != Invert)
                    return;             // если выполниться этот return  
 
            if (ByteIn == ManIdentifier [0])    
                ManFlags &= ~bLINE_INV;     
            else                
                ManFlags |= bLINE_INV;      
                
            BitCounter = 0;                         
            ByteCounter++;
            return;
        }
Если при выполнении этого условного оператора if (ByteIn != Invert) выполниться следующее за ним return, то в какой строчке программа продолжит свое выполнение?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.09.2015, 18:20
Ответы с готовыми решениями:

Подскажите пожалуйста не работает return 0;
Только начинаю учить C++, чего не выводится 0 на экран, где ошибка? #include <iostream> using namespace std; int main() {...

Использование return с тернарным оператором
Вроде и правильно написал тернарный оператор Но почему то компилятор пишет синтаксическая ошибка: return int sign1(int X) { ...

Помогите пожалуйста с условным оператором в запросе
Доброго всем времени суток! Сложилась проблемка с запросом. Необходимо формирование в запросе поля "площадка" в зависимости от...

8
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.09.2015, 18:25
Уровнем выше после того места, где был вызов текущей функции.
0
0 / 0 / 0
Регистрация: 09.03.2011
Сообщений: 18
10.09.2015, 18:29  [ТС]
На какой номер строчки? Получается, что если условие постоянно будет выполняться, то будет что то вроде зацикливания?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.09.2015, 18:34
Ты смысл return понимаешь? Это выход из функции. Ты показал кусочек, по нему не видно куда будет переход, потому что не ясно, в какой функции он и откуда её вызвали.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.09.2015, 19:56
Цитата Сообщение от lancer5610 Посмотреть сообщение
то в какой строчке программа продолжит свое выполнение?
на первой инструкции, следующей после вызова данной функции.
0
0 / 0 / 0
Регистрация: 09.03.2011
Сообщений: 18
10.09.2015, 23:20  [ТС]
Этот кусочек кода находится в функции которая обрабатывает прерывание микроконтроллера... Значит когда происходит return, то обработка прерывания прекращается и контроллер начинает продолжать выполнять основную программу?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.09.2015, 23:23
Вероятно.
0
0 / 0 / 0
Регистрация: 09.03.2011
Сообщений: 18
10.09.2015, 23:30  [ТС]
Вот полный код этой функции...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//Обработка внешнего прерывания INT0
ISR (INT0_vect)
{
    //настроим таймер на паузу в 3/4 периода (после такой паузы - попадем в 1/4 слота следующего бита)
    uint8_t TimerVal = TCNT0;
    TCNT0 = 0 - (MAN_PERIOD_LEN * 3 / 4);   //счетчик таймера настроить на 3/4 длины периода MANCHESTER бита данных
    GICR &= ~(1<<INT0);                     //выключить внешнее прерывание
    GIFR = (1<<INTF0);                      //на случай ВЧ сигнала сбросить возможно проскочившее повторное прерывание  
    
    //проверка на корректность длительности замера (измеряли начиная с 1/4 бита до середина бита (момент перепада))
    if ((TimerVal > (MAN_PERIOD_LEN/2)) || (ManFlags & bTIM0_OVF))
    {
Init:   ManFlags &= ~(bTIM0_OVF);           //сбросить флаг переполнения
        ManFlags |= bHEADER_RCV;            //ожидать прием заголовка
        ByteCounter = 0;                    //начать прием с начала
        ByteIn = 0x00;                      //очистить байт приемник
    }
 
    //задвигаем принятый бит
    ByteIn <<= 1;                           //сдвигаем байт перед записью бита
    if (! (ManFlags & bLINE_VAL))           
        ByteIn |= 1;                    
 
    //крутимся тут до окончания приема хедера
    if (ManFlags & bHEADER_RCV)
    {           
        //крутимся тут пока не совпадет первый байт хедера
        if (ByteCounter == 0)
        {   
            uint8_t Invert = ~ManIdentifier [0];
            if (ByteIn != ManIdentifier [0])
                if (ByteIn != Invert)
                    return;                 //пока нет совпадения - выход
 
            if (ByteIn == ManIdentifier [0])    
                ManFlags &= ~bLINE_INV;     //прямое совпадение
            else                
                ManFlags |= bLINE_INV;      //инверсное совпадение
                
            BitCounter = 0;                 //готовимся к приему следующих байтов хедера                   
            ByteCounter++;
            return;
        }
 
        //принимаем остальные байты хедера и байт длины пакета
        if (++BitCounter < 8)               //ждем заполнения байта
            return;
 
        if (ManFlags & bLINE_INV)           //если сигнал инверсный
            ByteIn = ~ByteIn;       
 
        if (ManIdentifier [ByteCounter])    //если хедер еще не закончен
        {   
            if (ByteIn != ManIdentifier [ByteCounter])//проверяем идентичность хедера
                goto Init;                  //байт не соответствует хедеру - рестарт 
            
            BitCounter = 0;
            ByteCounter++;                  //ожидаем следующий байт хедера
            return;
        }
        
        //хедер закончился, значит принят байт длины блока данных    
        if (ByteIn > MAN_BUF_LENGTH)
            goto Init;                      //размер блока данных превышает допустимый - рестарт
                
        DataLength = ByteIn;                //запомним длину пакета
        CheckSummByte = 0;                  //очистить байт контрольной суммы
        CheckSumm (ByteIn);                 //подсчет контрольки, начиная с байта длины пакета
 
        ManFlags &= ~bHEADER_RCV;           //переходим к приему основного файла
        BitCounter = 0;                                     
        ByteCounter = 0;
        return;
    }
        
    //принимаем основной блок данных         
    if (++BitCounter < 8)                   //ждем накопления байта
        return;
    BitCounter = 0;
 
    if (ManFlags & bLINE_INV)               //необходима ли инверсия
        ByteIn = ~ByteIn;       
 
    CheckSumm (ByteIn);                     //подсчет контрольки
 
    if (DataLength--)                       //если это еще байты пакета - 
        ManBuffer [ByteCounter++] = ByteIn; // - сохраняем принятый байт
    else                                    //если пакет закончен - 
    {                                   
        if (CheckSummByte)                  //если контролька не верна (не 0) - 
            goto Init;                      // - рестарт
 
        //контролька правильная 
        ManFlags |= bDATA_ENBL;             //установить флаг наличия данных
        ManReceiveStop ();                  //тормозим дальнейший прием
    }
}

Просто если при выполнении return происходит выход из прерывания, то получается эта функция никогда до конца не выполниться... А она вроде как работает...
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.09.2015, 07:56
Почему никогда? Там же условия стоят и почти все переменные внешние. Ну не с первого раза.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.09.2015, 07:56
Помогаю со студенческими работами здесь

Подскажите новичку по return
Форма передает fname, пишу метод: def fio=(fname) puts fname endвсе прекрасно передается, в консоле вижу содержимое fname,...

Объясните пожалуйста, что значит return и какое - то число
Return &lt;Число&gt; Что это значит? Например: return 0 ; return 1 ? Помогите, я уже 2 часа мучаюсь :wall:

Подскажите каким оператором воспользоваться при переносе значения из строки
Доброго времени суток уважаемые форумчане! Столкнулся с такой проблемой. Есть 3 таблицы в базе данных, одна главная и две...

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

Подскажите как переделать функцию c ref на return
Добрый вечер, подскажите и поясните как можно данную функцию переделать что бы не использовать ref а возвращать с помощью return но при...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru