|
Что означает этот код? |
|
|
|
Mar 8 2014, 15:05
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Здравствуйте уважаемые форумчане. Возник вопрос при оптимизации кода. Было Код data[0] = w1_receive_byte();//читаем два байта с температурой data[1] = w1_receive_byte(); //загоняем в двух байтную переменную temp = data[1]; temp = temp<<8; temp |= data[0]; Подсказали что лучше использовать такое выражение Код *((char *)&Temp;) = w1_receive_byte(); *((char *)&Temp; + 1) = w1_receive_byte(); Вот никак не могу понять смысла этого кода. Я так понимаю что * и & это операции над указателями , а () приведение к типу но.... Вообщем если не трудно объясните начинающему подробно смысл сей конструкции.
|
|
|
|
|
 |
Ответов
|
Mar 8 2014, 16:01
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Ужас какой-то. Это как раз тот случай, когда достоинства языка превращают в недостатки кода  Вполне достаточно такого кода, все понятно и ничего лишнего: Код temp = w1_receive_byte(); temp <<= 8; temp |= w1_receive_byte(); Хотя, если data[] - локальная переменная и больше нигде не используется, компилятор ее сам выкинет.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Mar 8 2014, 16:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Harvester @ Mar 8 2014, 23:01)  Ужас какой-то. Это как раз тот случай, когда достоинства языка превращают в недостатки кода  Вполне достаточно такого кода, все понятно и ничего лишнего: Код temp = w1_receive_byte(); temp <<= 8; temp |= w1_receive_byte(); Немного позанудствую. С первой и второй строкой всё нормально, а вот с третьей... Результат выполнения этого может быть разным в зависимости от типов данных переменной temp и типа, возвращаемого функцией w1_receive_byte(). Даже если он определён как char, это ещё ничего не гарантирует, в С char может быть как знаковым так и беззнаковым, отдано на откуп реализации. Для конкретного компилятора может и прокатит, как правило сейчас char считается беззнаковым. Но если заботиться о переносимости, то надёжнее явно привести к беззнаковому типу: temp |= (unsigned char)w1_receive_byte(); или, ещё лучше и короче c использованием типов из stdint.h : temp |= (uint8_t)w1_receive_byte();
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
Сообщений в этой теме
RW6MKA Что означает этот код? Mar 8 2014, 15:05 _Артём_ Цитата(RW6MKA @ Mar 8 2014, 19:05) Код *... Mar 8 2014, 15:15 RW6MKA А более подробно можно. Конкретно по каждому знаку... Mar 8 2014, 15:29 _Артём_ Цитата(RW6MKA @ Mar 8 2014, 19:29) А боле... Mar 8 2014, 15:37  RW6MKA Цитата(_Артём_ @ Mar 8 2014, 19:37) Берёт... Mar 8 2014, 15:58   Harvester Цитата(RW6MKA @ Mar 8 2014, 19:58) Вот эт... Mar 8 2014, 16:25    RW6MKA Цитата(Harvester @ Mar 8 2014, 20:25) Ука... Mar 9 2014, 03:47     aaarrr Цитата(RW6MKA @ Mar 9 2014, 07:47) То ест... Mar 9 2014, 04:09      RW6MKA Цитата(aaarrr @ Mar 9 2014, 08:09) По при... Mar 9 2014, 07:11 aaarrr Цитата(RW6MKA @ Mar 8 2014, 19:05) Подска... Mar 8 2014, 15:36 RW6MKA Ну вроде экономия памяти при компиляции. Можно кон... Mar 8 2014, 15:54 aaarrr * - указатель
Без лишней памяти лучше будет напис... Mar 8 2014, 15:57 aaarrr Цитата(RW6MKA @ Mar 8 2014, 19:58) Вот эт... Mar 8 2014, 16:02 RW6MKA Цитата(aaarrr @ Mar 8 2014, 20:02) Есть т... Mar 8 2014, 16:13 aaarrr Обычно из таких - низкоуровневых - функций данные ... Mar 9 2014, 07:30 RW6MKA Цитата(aaarrr @ Mar 9 2014, 11:30) Обычно... Mar 9 2014, 08:20  aaarrr Цитата(RW6MKA @ Mar 9 2014, 12:20) Какой ... Mar 9 2014, 08:28  SM Цитата(RW6MKA @ Mar 9 2014, 12:20) от -4... Mar 9 2014, 08:32 RW6MKA Во общем из советов я прихожу к выводу, что float ... Mar 9 2014, 08:56 aaarrr Могут. На 8-16 битных архитектурах ничем не отлича... Mar 9 2014, 09:13 RW6MKA Понятно. Тогда с учетом того, что я пишу код в AVR... Mar 9 2014, 09:35 aaarrr Правильнее будет int16_t, а не uint - результат ве... Mar 9 2014, 09:38 SM Цитата(aaarrr @ Mar 9 2014, 13:38) Правил... Mar 9 2014, 09:44 RW6MKA Цитата(aaarrr @ Mar 9 2014, 13:38) Правил... Mar 9 2014, 09:48  aaarrr Цитата(RW6MKA @ Mar 9 2014, 13:48) Нет, з... Mar 9 2014, 10:06   RW6MKA Цитата(aaarrr @ Mar 9 2014, 14:06) Но есл... Mar 9 2014, 10:15 Xenia Судя по стартовому посту темы, вопрос касался опти... Mar 9 2014, 10:34 SM Цитата(Xenia @ Mar 9 2014, 14:34) т.е. ст... Mar 9 2014, 10:41  Xenia Цитата(SM @ Mar 9 2014, 14:41) Вот это, к... Mar 9 2014, 10:49   SM Цитата(Xenia @ Mar 9 2014, 14:49) Но тогд... Mar 9 2014, 11:07 aaarrr Цитата(Xenia @ Mar 9 2014, 14:34) Судя по... Mar 9 2014, 10:46  _Артём_ Цитата(aaarrr @ Mar 9 2014, 14:46) Во-пер... Mar 9 2014, 10:50   aaarrr Цитата(_Артём_ @ Mar 9 2014, 14:50) В 21 ... Mar 9 2014, 10:58    _Артём_ Цитата(aaarrr @ Mar 9 2014, 14:58) У Вас ... Mar 9 2014, 11:08     SM Цитата(_Артём_ @ Mar 9 2014, 15:08) что M... Mar 9 2014, 11:11 adnega Господа программисты, особенно начинающие, обратит... Mar 9 2014, 11:21 SM Цитата(adnega @ Mar 9 2014, 15:21) union ... Mar 9 2014, 11:26  aaarrr Цитата(SM @ Mar 9 2014, 15:26) Прямое сре... Mar 9 2014, 11:30 RW6MKA Уважаемые форумчане, перестаньте в присутствии нов... Mar 9 2014, 12:21 aaarrr Не обращайте внимания, день сегодня такой... выход... Mar 9 2014, 12:26
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|