С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/75: Рейтинг темы: голосов - 75, средняя оценка - 4.81
25 / 25 / 14
Регистрация: 14.07.2016
Сообщений: 108

Что означает *(uint8_t*)(&pbuf)?

07.01.2017, 23:14. Показов 16008. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет,
C
1
2
uint8_t *pbuf
uint8_t memtype;
Что делается в выражении
C
1
  memtype = *(uint8_t*)(&pbuf);
???
Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2017, 23:14
Ответы с готовыми решениями:

Что означает строчка кода val = val & 0xF; ?
Что означает строчка кода? val = val & 0xF; Не понятно использование оператора &

Что делает эта строчка: ++x && ++y || ++z; ?
Что делает эта строчка? ++x && ++y || ++z;

Кто сможет объяснить что означает в этом коде 0x55555, что это такое, для чего предназначено?
#include "stdafx.h" #pragma warning(disable : 4996) #include <stdio.h> #include <conio.h> #include <iostream> int main() ...

22
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 08:49
Адрес переменной pbuf приводится к типу "указатель на uint8_t", после чего значение по этому адресу записывается в переменную memtype (с неявным преобразованием к типу uint8_t). Иными словами, в memtype заносится адрес переменной, на которую указывает pbuf. Смысл этой конструкции для меня остаётся загадкой.

Добавлено через 9 часов 9 минут
Ещё важно отметить, что преобразование указателя к типу uint8_t происходит с потерей старших байтов, поскольку тип uint8_t - восьмибитный, и адрес в него никак не влезет. Поэтому остаётся неясным, зачем вообще может понадобится такая конструкция.
2
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.01.2017, 09:41
Цитата Сообщение от likehood Посмотреть сообщение
Поэтому остаётся неясным, зачем вообще может понадобится такая конструкция.
К примеру затем чтобы поиметь младшие 8 разрядов адреса. Если это выдрано из какого нибудь менеджера кучи то может быть очень даже актуальной для решения общей задачи операцией.
1
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 10:11
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
К примеру затем чтобы поиметь младшие 8 разрядов адреса.
В принципе, из кода это понятно. Но, чтобы у читателя не возникало сомнений, я бы назвал переменную memtype как-то по другому. Например, address_low_byte. Тем самым подчеркнув, что мы понимаем, что делаем, и нам действительно нужен только младший байт.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.01.2017, 11:04
Цитата Сообщение от likehood Посмотреть сообщение
Тем самым подчеркнув, что мы понимаем, что делаем, и нам действительно нужен только младший байт.
Не факт что он младший. Это платформозависимо. Может быть как раз и старшим который в данной реализации менеджера кучи определяет тип памяти куда указывает указатель (стек/сегмент данных/сегмент кода/куча/common область и т.п.).
2
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 12:04
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Не факт что он младший.
Странно, мне казалось, что преобразование типов выполняется вполне однозначным образом. Другое дело, что адрес может по разному храниться в переменной-указателе. Но само преобразование одного целого числа в другое, меньшее по размеру, разве зависит от платформы?
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.01.2017, 12:25
Лучший ответ Сообщение было отмечено ArtemKolesnikov как решение

Решение

Цитата Сообщение от likehood Посмотреть сообщение
Другое дело, что адрес может по разному храниться в переменной-указателе.
Вот правильно тут как раз и берут первый байт адреса. т.е. к uint8_t* приводят не сам buf а &buf - т.е. адрес указателя. а потом по этому адресу берут первый байт.

Добавлено через 10 минут
т.е.&buf приводят к типу uint8_t* а потом извлекают значение по этому указателю. поскольку указатель имеет тип uint8_t* то и извлекается один байт который уже ни к чему не приводится при присваивании.
2
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 12:28
Да, теперь понял. Спасибо.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.01.2017, 12:38
Цитата Сообщение от likehood Посмотреть сообщение
Странно, мне казалось, что преобразование типов выполняется вполне однозначным образом
В том-то и дело, что тут нет преобразования типов. Преобразование типов работает над значениями, в то время, как ты хочешь получить сначала битовый образ значения, а потом выковырять из него нужный набор битов и уже их превратить в значение нужного типа

Смысл конкретно данного примера мне так же непонятен. Если это фрагмент какого-то менеджера памяти, то логика его работы будет различаться на big-endian и little-endian
1
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
08.01.2017, 14:24
Не пойму, чем memtype = *(uint8_t*)(&pbuf); отличается от memtype = *pbuf;
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.01.2017, 15:26
Цитата Сообщение от zer0mail Посмотреть сообщение
Не пойму, чем memtype = *(uint8_t*)(&pbuf); отличается от memtype = *pbuf;
Если бы было написано "memtype = *(uint8_t*) pbuf;", то ничем. Но тут стоит &pbuff
1
25 / 25 / 14
Регистрация: 14.07.2016
Сообщений: 108
08.01.2017, 17:39  [ТС]
Всем огромное спасибо за участие!
Я могу привести весь код функции (это из готового официального примера от производителя), там потом полученное значение сравнивается с магическими (для меня) константами и pbuf приводится к data, xdata или pdata. и выполняется действие по макросу
Кликните здесь для просмотра всего текста

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
uint16_t hal_nrf_read_multibyte_reg(uint8_t reg, uint8_t *pbuf)
{
  uint8_t ctr, length;
  uint8_t memtype;
  uint8_t read_byte; /*lint -esym(530,read_byte) symbol not initialized*/
  bool first_round;
  first_round = true;
 
  memtype = *(uint8_t*)(&pbuf);
 
  switch(reg)
  {
    case HAL_NRF_PIPE0:
    case HAL_NRF_PIPE1:
    case HAL_NRF_TX:
      length = ctr = hal_nrf_get_address_width();
      CSN_LOW();
      hal_nrf_rw(RX_ADDR_P0 + reg);
      break;
 
    case HAL_NRF_RX_PLOAD:
      reg = hal_nrf_get_rx_data_source();
      if (reg < 7U)
      {
        length = ctr = hal_nrf_read_rx_payload_width();
        CSN_LOW();
        hal_nrf_rw(R_RX_PAYLOAD);
      }
      else
      {
        ctr = length = 0U;
      }
      break;
 
    default:
      ctr = length = 0U;
      break;
  }
 
  if (memtype == 0x00U)
  {
    uint8_t data *buf = (uint8_t data *)pbuf;
    NRF_READ_MULTIBYTE_REG_COMMON_BODY
  }
  else if (memtype == 0x01U)
  {
    uint8_t xdata *buf = (uint8_t xdata *)pbuf;
    NRF_READ_MULTIBYTE_REG_COMMON_BODY
  }
  else if (memtype == 0xFEU)
  {
    uint8_t pdata *buf = (uint8_t pdata *)pbuf;
    NRF_READ_MULTIBYTE_REG_COMMON_BODY
  }
  else
  {
    uint8_t *buf = (uint8_t *)pbuf;
    NRF_READ_MULTIBYTE_REG_COMMON_BODY
  }
 
  CSN_HIGH();
 
  return (((uint16_t) reg << 8) | length);
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.01.2017, 17:52
Цитата Сообщение от ArtemKolesnikov Посмотреть сообщение
Я могу привести весь код функции
Без описания используемых в нём макросов он малополезен
Кому интересен оригинал, видимо, следует заглянуть сюда https://github.com/elechouse/W... /hal_nrf.c
0
25 / 25 / 14
Регистрация: 14.07.2016
Сообщений: 108
08.01.2017, 18:07  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Без описания используемых в нём макросов он малополезен
Ну почему же, макросы к теме не относятся, а будут отвлекать внимание. К тому же, если вы обратили внимание, они одинаковы в каждом случае при сравнении значения memtype с магическими (для меня) значениями. Вопрос был про выражение.
Это код из программного обеспечения к комплекту разработчика от производителя чипа. Скачивается на официальном сайте (без гитхаба). чип nRF24LE1.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.01.2017, 18:51
Цитата Сообщение от ArtemKolesnikov Посмотреть сообщение
К тому же, если вы обратили внимание, они одинаковы в каждом случае
Это они для тебя, как для начинающего одинаковы. Я, например, более чем уверен, что макрос NRF_READ_MULTIBYTE_REG_COMMON_BODY раскрывается во что-то, что использует переменную "buf", которая имеет разный тип в каждом из блоков. Причём даже не понятно, что за тип, потому что по внешнему виду имеет место быть синтаксическая ошибка, так что либо uint8_t, либо data/xdata/pdata являются макросами. Либо какое-то нестандартное расширение Си в компиляторе под этот девайс

Цитата Сообщение от ArtemKolesnikov Посмотреть сообщение
Вопрос был про выражение
Для тебя вопрос по языку исчерпан, хотя лично я более чем уверен в том, что ты не понимаешь, что конкретно этот код делает. Так же как и прочие не понимают, ради чего в код включена такая извращённая конструкция. Наверняка найдётся и те, кому станет интересно, что же там такое, бесприменительно к тому, поймёшь ты это, или нет. Собственно, для них и поместил ссылку
0
25 / 25 / 14
Регистрация: 14.07.2016
Сообщений: 108
08.01.2017, 19:22  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
кому станет интересно, что же там такое
Без железа на руках (на столе перед глазами)?
Цитата Сообщение от Evg Посмотреть сообщение
Для тебя вопрос по языку исчерпан

Не по теме:

Любой вопрос на любом форуме исчерпан только тогда, когда задавший вопрос (ТС) вопрос сам для себя решит, что он во всем разобрался не без помощи тех, кто помог ему в этом разобраться и дал правильный намек.
А товарищи, которые сидят (на попе) и умничают "Я вот такой супер-пупер умный и крутой, а ты не разобрался, и никто не разобрался, и вообще ничего не понимаешь в своем коде (в своей теме)..." и т.д. заслуживают ЧСВ lv. 9000 (если он им ранее не присвоен). Я сталкивался с такими давно на отдельном радио-кошачем форуме. Ну, бывает, что скажешь.
В моей профессии (я инженер-электрик, не программист) такие коллеги тоже есть. Я обычно молчу и даю им выговариваться сколько душе угодно. Кто-где учился и кто-что умеет, на какой подстанции работал/работает, с каким оборудованием и т.д. Тык...
Ну хочется человеку потешить свое эго, ну разве можно у него отнимать эту игрушку? Обидится же, если отнять.

0
738 / 543 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
09.01.2017, 06:29
Цитата Сообщение от ArtemKolesnikov Посмотреть сообщение
заслуживают ЧСВ lv. 9000 (если он им ранее не присвоен).
ну вот,вместо того чтобы поблагодарить за науку,взял нахамил
3
25 / 25 / 14
Регистрация: 14.07.2016
Сообщений: 108
09.01.2017, 11:37  [ТС]
Цитата Сообщение от LFC Посмотреть сообщение
поблагодарить за науку,взял нахамил
Покажите пожалуйста (может я слепой/тупой), за какую науку благодарить и кому "нахамил" то ?

Вас тоже нужно отблагодарить за ваше ценное замечание?
Ок, спасибо.
Вообще вопрос решен, я объяснение получил, а дальше сам буду вникать в глубокие конкретные подробности, параллельно разбераясь с volatile.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
09.01.2017, 11:42
Судя по тому, что я вижу в этом коде, инструкция
C
1
memtype = *(uint8_t*)(&pbuf);
есть конверсия указателя на тип uint8_t** в целое типа uint8_t. Причем каст к uint8_t* и разыменование дает эффект реинтерпритации байтов pbuf как uint8_t. По аналогии с плюсовым reinterpret_cast-ом. Что касается "почему именно так", мне думается просто из-за того, что нужно было валидное и портабельное решение. И, навскидку точно не скажу, но на глаз похоже, что оно еще и endian-независимое.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.01.2017, 11:56
Цитата Сообщение от HighPredator Посмотреть сообщение
И, навскидку точно не скажу, но на глаз похоже, что оно еще и endian-независимое
Зависимое. Для little endian берутся младшие 8 бит адреса, а для big-endian - старшие. Поскольку речь идёт о софте для конкретного процессора, то этот момент с общей точки зрения непринципиален. А по сути надо лезть в исходники и смотреть.

Как вариант вполне может быть так, что железка big-endian и в ней пространство физических адресов раскидано по сегментам с разными свойствами. Типа того, что сегменты с адресами 0x0000-0x00ff, 0x0100-0x01ff, 0xfe00-0xfeff обладают какими-то особыми свойствами. Но это мои догадки из разряда "ткнуть пальцем в небо", что бы понять, что там в реальности, надо подробно изучать весь исходник и описание железки
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.01.2017, 11:56
Помогаю со студенческими работами здесь

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка?
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

Что означает && в программе ЧПУ?
Здравствуйте. В программе ЧПУ станка имеются подобные строчки IFGOTO 98 Подскажите пожалуйста что может означать &amp;&amp;

Что означает && и || в C++?
И как это применяется

query='SELECT * FROM resume WHERE ' & ''' & RecSet('place')& ''' & '=' & '''& s_loc &''' & - что не так?
упростил для краткости запрос. в чем ошибка? RecSet - это коннекшн. query='SELECT * FROM resume WHERE ' &amp; ''' &amp;...

Что означает *&
Искал я информацию про деревья в с++, нашёл информацию в http://ci-plus-plus-snachala.ru/?p=1249 но там используется *&amp;, что мне не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 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 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru