Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подскажите по следующим конструкциям на СИ:
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Alla_student
Я начала только заниматься программированием на СИ и встретилась с непонятными записями - конструкциями в исходниках на СИ:

1) работа со структурами

HSRR1 = pTpu->HSRR1;
HSRR1.Field.CH0 = 0x3;
HSRR1.Field.CH1 = 0x3;
HSRR1.Field.CH2 = 0x1;
HSRR1.Field.CH3 = 0x3;
HSRR1.Field.CH4 = 0x3;
HSRR1.Field.CH5 = 0x1;
HSRR1.Field.CH6 = 0x2;
HSRR1.Field.CH7 = 0x2;
pTpu->HSRR1 = HSRR1;
что здесь делает первая и последняя строка, первая понятно заносит значение регистра pTpu в HSPR1, а последняя?
2) зачем используется подчеркивание перед именем константы или переменной?
3) такая запись *my_value означает ссылку, а такая *my_value * что?

Где вообще можно почитать про всякие хитрые конструкции на зыке СИ с манипуляцией с ссылками, с присвоением типов и т.д.?

Спасибо за внимание.
rezident
В начале списка литературы должен стоять стандарт ANSI С99 (ISO/IEC 9899:1999 (E)) wink.gif По ссылке его вариант с несколькими техническими коррекциями.
Затем "библия" - Керниган, Ричи. Язык C
Но можно и в он-лайн справочниках глянуть http://www.opennet.ru/docs/RUS/bogatyrev/gl_2.html
AlexandrY
Цитата(Alla_student @ Apr 5 2011, 15:54) *
Я начала только заниматься программированием на СИ и встретилась с непонятными записями - конструкциями в исходниках на СИ:

1) работа со структурами

HSRR1 = pTpu->HSRR1;
HSRR1.Field.CH0 = 0x3;
HSRR1.Field.CH1 = 0x3;
HSRR1.Field.CH2 = 0x1;
HSRR1.Field.CH3 = 0x3;
HSRR1.Field.CH4 = 0x3;
HSRR1.Field.CH5 = 0x1;
HSRR1.Field.CH6 = 0x2;
HSRR1.Field.CH7 = 0x2;
pTpu->HSRR1 = HSRR1;
что здесь делает первая и последняя строка, первая понятно заносит значение регистра pTpu в HSPR1, а последняя?
2) зачем используется подчеркивание перед именем константы или переменной?
3) такая запись *my_value означает ссылку, а такая *my_value * что?

Где вообще можно почитать про всякие хитрые конструкции на зыке СИ с манипуляцией с ссылками, с присвоением типов и т.д.?

Спасибо за внимание.


Все зависит от особенностей психики конкретного программиста.
Первый пункт это просто такая попытка очень ясно и самодокументировано показать в какое поле регистра что записывается, но при этом саму запись в регистр провести за один цикл (некоторые аппаратные регистры к этому критичны). Способов сделать то же самое, но в других выражениях есть туча.
Такая запись могла быть также следствием того, что программисту уже достались готовые хидеры с таким описанием структур регистров.

Подчеркивание. Это может связано с желанием указать на некоторую интимность переменной. Т.е. что-то такое, что не вписывается в официальную структуру программы или о чем не должны спрашивать другие программисты. wink.gif
Никогда не использовал подчеркивание впереди переменных. Правда иногда юзаю чтобы в алфавитных списках такие имена оказывались наверху.

Последний пункт похоже сильно вырван из контекста, может умножение с переносом продолжения в следующую строку?

По молодости хочется следовать советам из книжек, но потом понимаешь, что следовать логичнее устоявшимся практикам сорсов с которыми больше всего работаешь и собственным психологическим особенностям.
А они могут кардинально противоречить даже самым именитым авторам.
Alla_student
Цитата(AlexandrY @ Apr 5 2011, 17:29) *
Все зависит от особенностей психики конкретного программиста.
Первый пункт это просто такая попытка очень ясно и самодокументировано показать в какое поле регистра что записывается, но при этом саму запись в регистр провести за один цикл (некоторые аппаратные регистры к этому критичны). Способов сделать то же самое, но в других выражениях есть туча.
Такая запись могла быть также следствием того, что программисту уже достались готовые хидеры с таким описанием структур регистров.

Да действительно, хидеры созданы мотороловскими программистами. Т.е. первая и последняя строка компилятором,(он же GNU C, создается код записи регистра одним словом за раз?!

Цитата
Подчеркивание. Это может связано с желанием указать на некоторую интимность переменной. Т.е. что-то такое, что не вписывается в официальную структуру программы или о чем не должны спрашивать другие программисты. wink.gif
Никогда не использовал подчеркивание впереди переменных. Правда иногда юзаю чтобы в алфавитных списках такие имена оказывались наверху.

Подчеркивание часто встречается в этом исходнике при использовании typedef например:

typedef union
{
uint16 Word;
struct
{
uint16 STOP:1;
uint16 TCR1P:2;
uint16 TCR2P:2;
uint16 EMU:1;
uint16 T2CG:1;
uint16 STF:1;
uint16 SUPV:1;
uint16 PSCK:1;
uint16 Nc1:2;
uint16 IARB:4;
} Field ;
}
_TPUMCR;

Цитата
Последний пункт похоже сильно вырван из контекста, может умножение с переносом продолжения в следующую строку?

Здесь например (понятно присвоение фиксированного адреса константе) что делает звездочка?
pQsm = (_QSM*) 0xfffc00;
или
(void *)((pSpc3->R_Diag_Buf_Ptr[1]<<3) +(unsigned int)pSpc3)


Цитата
По молодости хочется следовать советам из книжек, но потом понимаешь, что следовать логичнее устоявшимся практикам сорсов с которыми больше всего работаешь и собственным психологическим особенностям.
А они могут кардинально противоречить даже самым именитым авторам.

Да и хотелось почитать умное, но не заумное, из произведений "бывалых". А то что не строка, то не похоже на Керниган и Ричи Язык C.

Цитата(rezident @ Apr 5 2011, 17:15) *
В начале списка литературы должен стоять стандарт ANSI С99 (ISO/IEC 9899:1999 (E)) wink.gif
...

Cпасибо
rezident
Цитата(Alla_student @ Apr 5 2011, 22:03) *
Здесь например (понятно присвоение фиксированного адреса константе) что делает звездочка?
pQsm = (_QSM*) 0xfffc00;
или
(void *)((pSpc3->R_Diag_Buf_Ptr[1]<<3) +(unsigned int)pSpc3)
Звездочка в при объявлении типа переменной означает, что это указатель. Указатель это по сути адрес объекта в памяти. В вашем первом примере pQsm это указатель типа _QSM (первый символ p от слова pointer, такое обозначение, кстати, указывает на хороший стиль программирования) . (_QSM*) это явное приведение типа константы к типу указателя. Константа конечно может быть адресом, но в общем случае значение указателя (адрес) и значение константы не одно и то же. Поэтому компилятору требуется явно приказать, что значение константы нужно интерпретировать именно как значение указателя.
Во втором примере (void *) это тоже явное приведение типа к "пустому" указателю. В скобках осуществляется операция вычисления адреса. Для этого адрес объекта (адрес второго элемента какого-то буфера по имени R_Diag_Buf_Ptr) умножается на 8 (арифметический сдвиг влево на 3 <<3 аналогичен умножению на 2^3) и складывается со значением указателя pSpc3. Для того чтобы значения указателей можно было сложить как целые числа потребовалось явное приведение типа к беззнаковому целому типу unsigned int.
demiurg_spb
Цитата(rezident @ Apr 5 2011, 20:19) *
Звездочка ... означает, что это ..
Лейтенант младший biggrin.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.