((PtrToStruct) * (без знака int *) АДРЕС) - PullRequest
0 голосов
/ 18 октября 2018

До того, как я спросил, у меня есть похожий вопрос.Самый секретный: https://www.careercup.com/forumpost?id=5752438032171008

Но я до сих пор не понимаю, в чем смысл этого кода?

((PtrToStruct)*(unsigned int*)ADDRESS)

Вот оригинальный формат кода:

typedef struct __st_vec{
    member 1
    ...
    ...
    ...
    member n
}VEC, *PVEC;

#define ADDRESS 0x2000
#define VEC_PLACE() ((PVEC)*(unsigned int*)ADDRESS)

тогда где-нибудь в коде можно использовать его для получения данных члена в struct

variable = VEC_PLACE()->member 1;

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Этот код очень специфично ориентирован на HW.

На самом деле предполагается, что адрес структуры данных типа VEC хранится как ADDRESS, а размер адреса / указателя равен sizeof(unsigned int).

((PVEC)*(unsigned int*)ADDRESS)

==> (unsigned int*)ADDRESS - использовать значение ADDRESS в качестве указателя на unsigned int

==> *(unsigned int*)ADDRESS - разыменовать его ( чтение sizeof(unsigned int) байт с адреса ADDRESS).

==> (PVEC)*(unsigned int*)ADDRESS - использовать / обрабатывать это разыменованное значение как указатель (адрес) на структуру VEC

0 голосов
/ 18 октября 2018

Многие аппаратные системы имеют регистры с отображением памяти, места, где они хранят или читают данные.В небольших встроенных системах прямого подключения к оборудованию эти регистры часто размещаются в фиксированных местах, то есть в адресах.

Что делает макрос, так это в основном обеспечивает более удобный доступ к такому расположению, вместо того, чтобызаписывать все приведения и разыменования каждый раз.


В частности, в расположении ADDRESS (0x2000), кажется, хранится указатель на структуру типа VEC.

С (unsigned int*)ADDRESS макрос делает вид, что значение ADDRESS действительно является указателем на unsigned int.Затем макрос разыменовывает этот указатель, чтобы получить значение, хранящееся в памяти в ADDRESS.Наконец, это значение затем преобразуется в указатель на VEC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...