Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
avitec
Заблокирован
1

Что делает Return в плюсах?

12.04.2017, 14:25. Просмотров 264. Ответов 8
Метки нет (Все метки)

Судя по прочитанной литературе по с++ return что-то возвращает в вызывающую программу, но в одном месте попался странный код и не только потому что в ретурне находится элемент массива, а еще и то, что сам этот массив странный, в нем индекс не сам один а вычисляется через логическое "И" с 16сс числом. Это почему и зачем так? может быть?
C++
1
2
3
4
5
6
7
8
int correct_cc(int ctrl_code)
/*
проверка корректности кода управления:
0 - несуществующий, 1 - нормальный.
*/
{
 return ccs[ctrl_code&=0x000F];
}
Добавлено через 9 минут
Если переменная Ctrl_code равна int 0 (0x0)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2017, 14:25
Ответы с готовыми решениями:

Что делает return в функции void?
void handle_arrival(vector<Car>& cars, vector< stack<string> >& parking_lot,...

Не понятно что делает __success(return >= 0)
Увидел определение HRESULT typedef __success(return >= 0) long HRESULT; не...

Как сделать так, что если файл существует return true, если нет - return false
Здравствуйте, я новичок в программировании. Мой вопрос очень прост: как...

Что означает запись в скобках и что возвращает return
Всем привет! Начал читать книгу BecomeAnXcoder и тут появился вопрос. В...

Что в программе делает так, что процессор грузится на 100%?
Я не очень разбираюсь в С++, поэтому прошу вашей подсказки по поводу нагрузки...

8
DemolitionMan
129 / 155 / 87
Регистрация: 06.04.2016
Сообщений: 992
12.04.2017, 14:25 2
Ну такая логика у программы, наверное. Нам-то откуда знать. Слово return просто возвращает элемент массива и все.
0
Max Dark
шКодер самоучка
1968 / 1745 / 860
Регистрация: 09.10.2013
Сообщений: 3,854
Записей в блоге: 6
Завершенные тесты: 2
12.04.2017, 14:27 3
Цитата Сообщение от avitec Посмотреть сообщение
Это почему и зачем так?
Развернем код
C++
1
2
3
4
5
6
int correct_cc(int ctrl_code)
{
    ctrl_code = ctrl_code & 0x000F; // получаем состояние младших 4х бит
    // теперь ctrl_code содержит индекс из проверочной таблицы(0 <= ctrl_code <= 15)
    return ccs[ctrl_code]; // возвращаем значение из таблицы по индексу ctrl_code
}
1
liv
553 / 473 / 143
Регистрация: 07.10.2015
Сообщений: 1,574
Завершенные тесты: 1
12.04.2017, 14:28 4
avitec, сначала оставляются 4 младшие биты ctrl_code при помощи логического "И" с 0x0f, получится число 0-15.
Затем берется элемент массива ccs с индексом от 0 до 15, индекс равен полученному перед тем числу.
Полученный элемент возвращается из функции.
Если Ctrl_code == 0, то вернется нулевой элемент ccs
1
Байт
Эксперт C
18318 / 12029 / 2506
Регистрация: 24.12.2010
Сообщений: 24,293
12.04.2017, 14:35 5
Видимо, ccs - какой-то внешний массив. extern или static. Вполне возможно, что в нем только 16 элементов. int ccs[16].
Параметр ctrl_code может быть сборищем флагов. &0x0F выделяет младшие 4 цифры - 4 флага. Наверное, какие-то их комбинации допустимы (ccs[i]==1), какие-то - нет (ccs[i]==0)
Но это только догадки. Без контекста конкретнее сказать трудно.
А сам код вполне разумен.
0
avitec
Заблокирован
12.04.2017, 14:50  [ТС] 6
ccs это массив unsigned char [16] "\x01\x01\x01\x01\x01\x01\0\0\0\0\x01\x01\x01\0\0\0" в дебаггере, наверно в 16сс, в 2сс это было бы наверно это 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0. И нулевой элемент это 1. Но функция эта не имеет никакого смысла, так как массив ссs[16] из маски 0x000F можно использовать только самую младшую цыфру F, так как массив имеет всего 16 индексов. А F это 4 единицы и в логическом И они значение переменной ctrl_code не меняют, зачем тогда весть этот огород, можно было записать просто return[ctrl_code]? и не вызывать эту функцию, а сразу на верхнем уровне получить значение массива?

Добавлено через 1 минуту
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Ну такая логика у программы, наверное. Нам-то откуда знать
я думаю Вам и не нужно знать это мне хочется знать.

Добавлено через 46 секунд
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Слово return просто возвращает элемент массива и все
А какой?

Добавлено через 2 минуты
Цитата Сообщение от _liv_ Посмотреть сообщение
при помощи логического "И" с 0x0f, получится число 0-15
или я ошибся и берутся 2 декады или как их там 0f и тогда маска все же есть? Только не для этого нулевого значения?

Добавлено через 53 секунды
Цитата Сообщение от Байт Посмотреть сообщение
Вполне возможно, что в нем только 16 элементов. int ccs[16]
да вы были правы, так и есть

Добавлено через 1 минуту
Цитата Сообщение от Байт Посмотреть сообщение
&0x0F выделяет младшие 4 цифры - 4 флага.
значит все таки 4, тогда нет смысла в этой функции
0
Байт
Эксперт C
18318 / 12029 / 2506
Регистрация: 24.12.2010
Сообщений: 24,293
12.04.2017, 14:57 7
Цитата Сообщение от avitec Посмотреть сообщение
можно было записать просто return[ctrl_code]?
Нет. ctrl_cole может быть больше 15, состоять из большего количества флагов, чем 4. Функция же проверяет совместимость только последних 4-х
Цитата Сообщение от avitec Посмотреть сообщение
можно было записать просто
Можно. Вместо вызова функции писать просто ccs[ctrl_code&=0x000F]
Но это - хороший стиль. Проверка локализована, имеет хорошее мнемоническое название. Кроме того к функции возможно обращение и из других исходных модулей проекта.
0
Max Dark
шКодер самоучка
1968 / 1745 / 860
Регистрация: 09.10.2013
Сообщений: 3,854
Записей в блоге: 6
Завершенные тесты: 2
12.04.2017, 14:57 8
Цитата Сообщение от avitec Посмотреть сообщение
тогда нет смысла в этой функции
смысл в том, что ctrl_code может быть больше 15.
+ младшие 4 бита ctrl_code являются проверочными, что не было ошибок при передаче полного значения.
0
avitec
Заблокирован
12.04.2017, 14:58  [ТС] 9
Спасибо всем за разъяснение. Понятно примерно.
0
12.04.2017, 14:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2017, 14:58

Что такое return out?
///

Что значит return(n>=0)?n:-n)
Объясните кто сможет return((n&gt;=0)?n:-n)

Что это за знак >> прочитал что это сдвиг вправо? что он делает
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru