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

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

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

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

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

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

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

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

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

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

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

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

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

Не по теме:

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

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

Вас тоже нужно отблагодарить за ваше ценное замечание?
Ок, спасибо.
Вообще вопрос решен, я объяснение получил, а дальше сам буду вникать в глубокие конкретные подробности, параллельно разбераясь с volatile.
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 2
09.01.2017, 11:42 #19
Судя по тому, что я вижу в этом коде, инструкция
C
1
memtype = *(uint8_t*)(&pbuf);
есть конверсия указателя на тип uint8_t** в целое типа uint8_t. Причем каст к uint8_t* и разыменование дает эффект реинтерпритации байтов pbuf как uint8_t. По аналогии с плюсовым reinterpret_cast-ом. Что касается "почему именно так", мне думается просто из-за того, что нужно было валидное и портабельное решение. И, навскидку точно не скажу, но на глаз похоже, что оно еще и endian-независимое.
1
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
09.01.2017, 11:56 #20
Цитата Сообщение от HighPredator Посмотреть сообщение
И, навскидку точно не скажу, но на глаз похоже, что оно еще и endian-независимое
Зависимое. Для little endian берутся младшие 8 бит адреса, а для big-endian - старшие. Поскольку речь идёт о софте для конкретного процессора, то этот момент с общей точки зрения непринципиален. А по сути надо лезть в исходники и смотреть.

Как вариант вполне может быть так, что железка big-endian и в ней пространство физических адресов раскидано по сегментам с разными свойствами. Типа того, что сегменты с адресами 0x0000-0x00ff, 0x0100-0x01ff, 0xfe00-0xfeff обладают какими-то особыми свойствами. Но это мои догадки из разряда "ткнуть пальцем в небо", что бы понять, что там в реальности, надо подробно изучать весь исходник и описание железки
3
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 2
09.01.2017, 12:09 #21
Evg, хм, у меня было ощущение, что откастовав к целому, они да возьмут первый байт для биг, но он в нормальном представлении таки хвостовой, поэтому он и выходит по факту младшим что там что тут. Или я перемудрил? Не очень хорошо в таком разбираюсь. Просто по механике использования они определяют тип данных, сложенных в буфере. И поскольку они трясут хвостовой байт, сложилось впечатление, что они определяют тип по "выравниванию" на его основе. Что кстати не лишено смысла и по своему элегантно.
0
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
09.01.2017, 12:29 #22
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Допустим, значение указателя pbuf равно 0x11223344. В little-endian в памяти он будет лежать в виде 0x44, 0x33, 0x22, 0x11, а в bug-endian - 0x11, 0x22, 0x33, 0x44

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

Цитата Сообщение от HighPredator Посмотреть сообщение
И поскольку они трясут хвостовой байт, сложилось впечатление, что они определяют тип по "выравниванию" на его основе.
Да всё может быть, но проверка старшего байта в значении адреса с виду больше похоже на организацию памяти во всяких маленьких процессорах. В любом случае если вдруг кому-то не лень, было бы полезно поковыряться по исходникам
2
ArtemKolesnikov
23 / 23 / 10
Регистрация: 14.07.2016
Сообщений: 79
11.01.2017, 05:14  [ТС] #23
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Evg Посмотреть сообщение
с виду больше похоже на организацию памяти во всяких маленьких процессорах
Вы были правы.
Разобрался. Указатель pbuf (обобщенный тип указателя) занимает 3 байта памяти, первый байт (который выделяется) содержит информацию о сегменте памяти, в которой хранится значение переменной. У данной железки 0х00 - data , 0х01 - хdata , 0хFE - pdata.
Потом осуществляется приведение к конкретному типу указателя ("память-специфическому" перевел гугл).
Тяжело (долго) у меня понимается, но интересно.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2017, 05:14
Привет! Вот еще темы с ответами:

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

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

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

Что означает знак * в коде - C (СИ)
Вот функция из программы int length(char* st) { int L = 0; char* p = st; while (*p++) L++; return(1);...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.01.2017, 05:14
Ответ Создать тему
Опции темы

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