Форум программистов, компьютерный форум CyberForum.ru

C для начинающих

Войти
Регистрация
Восстановить пароль
 
 
ArtemKolesnikov
23 / 23 / 10
Регистрация: 14.07.2016
Сообщений: 79
#1

Что означает *(uint8_t*)(&pbuf)? - C (СИ)

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

Всем привет,
C
1
2
uint8_t *pbuf
uint8_t memtype;
Что делается в выражении
C
1
  memtype = *(uint8_t*)(&pbuf);
???
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2017, 23:14     Что означает *(uint8_t*)(&pbuf)?
Посмотрите здесь:

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

Что означает while (lock) - C (СИ)
объясните пожалуйста, что означает while (lock);? Я знаю примеры циклов WHile(a>5) например. А тут нету никакого оператора сравнения....

Что означает условие if(!in) - C (СИ)
Здравствуйте, что означает if(!in), что это за условие?

Что означает конструкция #if 0 - C (СИ)
есть у меня готовая программа. в ней есть следующая конструкция #if 0 //опреаторы #else //операторы #endif хотел бы...

Что означает символ $? - C (СИ)
Привет. Столкнулся с таким кодом: var i=0; while($i<100) { //операторы I++; }

Что означает операция *= - C (СИ)
Что означает данное выражение в Си? number *= 10;

Что означает запись .5? - C (СИ)
Что означает .5 на C? Спасибо :) Потрудитесь хотя бы одну строку набрать текстом, а не выкладывать в виде картинки!

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ArtemKolesnikov
23 / 23 / 10
Регистрация: 14.07.2016
Сообщений: 79
08.01.2017, 19:22  [ТС]     Что означает *(uint8_t*)(&pbuf)? #16
Цитата Сообщение от Evg Посмотреть сообщение
кому станет интересно, что же там такое
Без железа на руках (на столе перед глазами)?
Цитата Сообщение от Evg Посмотреть сообщение
Для тебя вопрос по языку исчерпан

Не по теме:

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

LFC
687 / 491 / 286
Регистрация: 17.09.2015
Сообщений: 1,454
09.01.2017, 06:29     Что означает *(uint8_t*)(&pbuf)? #17
Цитата Сообщение от ArtemKolesnikov Посмотреть сообщение
заслуживают ЧСВ lv. 9000 (если он им ранее не присвоен).
ну вот,вместо того чтобы поблагодарить за науку,взял нахамил
ArtemKolesnikov
23 / 23 / 10
Регистрация: 14.07.2016
Сообщений: 79
09.01.2017, 11:37  [ТС]     Что означает *(uint8_t*)(&pbuf)? #18
Цитата Сообщение от LFC Посмотреть сообщение
поблагодарить за науку,взял нахамил
Покажите пожалуйста (может я слепой/тупой), за какую науку благодарить и кому "нахамил" то ?

Вас тоже нужно отблагодарить за ваше ценное замечание?
Ок, спасибо.
Вообще вопрос решен, я объяснение получил, а дальше сам буду вникать в глубокие конкретные подробности, параллельно разбераясь с volatile.
HighPredator
5476 / 1842 / 343
Регистрация: 10.12.2010
Сообщений: 5,433
Записей в блоге: 3
09.01.2017, 11:42     Что означает *(uint8_t*)(&pbuf)? #19
Судя по тому, что я вижу в этом коде, инструкция
C
1
memtype = *(uint8_t*)(&pbuf);
есть конверсия указателя на тип uint8_t** в целое типа uint8_t. Причем каст к uint8_t* и разыменование дает эффект реинтерпритации байтов pbuf как uint8_t. По аналогии с плюсовым reinterpret_cast-ом. Что касается "почему именно так", мне думается просто из-за того, что нужно было валидное и портабельное решение. И, навскидку точно не скажу, но на глаз похоже, что оно еще и endian-независимое.
Evg
Эксперт CАвтор FAQ
17545 / 5783 / 370
Регистрация: 30.03.2009
Сообщений: 15,930
Записей в блоге: 26
09.01.2017, 11:56     Что означает *(uint8_t*)(&pbuf)? #20
Цитата Сообщение от HighPredator Посмотреть сообщение
И, навскидку точно не скажу, но на глаз похоже, что оно еще и endian-независимое
Зависимое. Для little endian берутся младшие 8 бит адреса, а для big-endian - старшие. Поскольку речь идёт о софте для конкретного процессора, то этот момент с общей точки зрения непринципиален. А по сути надо лезть в исходники и смотреть.

Как вариант вполне может быть так, что железка big-endian и в ней пространство физических адресов раскидано по сегментам с разными свойствами. Типа того, что сегменты с адресами 0x0000-0x00ff, 0x0100-0x01ff, 0xfe00-0xfeff обладают какими-то особыми свойствами. Но это мои догадки из разряда "ткнуть пальцем в небо", что бы понять, что там в реальности, надо подробно изучать весь исходник и описание железки
HighPredator
5476 / 1842 / 343
Регистрация: 10.12.2010
Сообщений: 5,433
Записей в блоге: 3
09.01.2017, 12:09     Что означает *(uint8_t*)(&pbuf)? #21
Evg, хм, у меня было ощущение, что откастовав к целому, они да возьмут первый байт для биг, но он в нормальном представлении таки хвостовой, поэтому он и выходит по факту младшим что там что тут. Или я перемудрил? Не очень хорошо в таком разбираюсь. Просто по механике использования они определяют тип данных, сложенных в буфере. И поскольку они трясут хвостовой байт, сложилось впечатление, что они определяют тип по "выравниванию" на его основе. Что кстати не лишено смысла и по своему элегантно.
Evg
Эксперт CАвтор FAQ
17545 / 5783 / 370
Регистрация: 30.03.2009
Сообщений: 15,930
Записей в блоге: 26
09.01.2017, 12:29     Что означает *(uint8_t*)(&pbuf)? #22
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Допустим, значение указателя pbuf равно 0x11223344. В little-endian в памяти он будет лежать в виде 0x44, 0x33, 0x22, 0x11, а в bug-endian - 0x11, 0x22, 0x33, 0x44

Цитата Сообщение от HighPredator Посмотреть сообщение
И поскольку они трясут хвостовой байт
Не хвостовой, а тот, который в памяти лежит в начальном адресе

Цитата Сообщение от HighPredator Посмотреть сообщение
И поскольку они трясут хвостовой байт, сложилось впечатление, что они определяют тип по "выравниванию" на его основе.
Да всё может быть, но проверка старшего байта в значении адреса с виду больше похоже на организацию памяти во всяких маленьких процессорах. В любом случае если вдруг кому-то не лень, было бы полезно поковыряться по исходникам
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2017, 05:14     Что означает *(uint8_t*)(&pbuf)?
Еще ссылки по теме:

Что означает строка? - C (СИ)
Объясните пожалуйста словами, что значит строка int *(*table());

Что означает конструкция *(*ptr + j) - C (СИ)
void board(int Mas) { for(int j=0;j<=99;j++) { cout<<*(*Mas+j)<<" "; } } можете объяснить че из себя...

Что означает каждая строка? - C (СИ)
Помогите, пожалуйста. Что обозначает каждая строка? Вот готовый рабочий код, который подсчитывает количество букв в самом длинном слове и...

Что означает запись 1LL? - C (СИ)
читаю чужую программу и вижу следующее long long a = 0, b = 0; // some code b = 1ll << 6177 % a-- * 4; не понятно что значит b =...

Что означает переполнение памяти - C (СИ)
Пожалуйста нужно сделать задание на С. Исследование алгоритма выделения памяти в C Никак не могу понять что означает переполнение...


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

Или воспользуйтесь поиском по форуму:
ArtemKolesnikov
23 / 23 / 10
Регистрация: 14.07.2016
Сообщений: 79
11.01.2017, 05:14  [ТС]     Что означает *(uint8_t*)(&pbuf)? #23
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Evg Посмотреть сообщение
с виду больше похоже на организацию памяти во всяких маленьких процессорах
Вы были правы.
Разобрался. Указатель pbuf (обобщенный тип указателя) занимает 3 байта памяти, первый байт (который выделяется) содержит информацию о сегменте памяти, в которой хранится значение переменной. У данной железки 0х00 - data , 0х01 - хdata , 0хFE - pdata.
Потом осуществляется приведение к конкретному типу указателя ("память-специфическому" перевел гугл).
Тяжело (долго) у меня понимается, но интересно.
Yandex
Объявления
11.01.2017, 05:14     Что означает *(uint8_t*)(&pbuf)?
Ответ Создать тему
Опции темы

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