реклама на сайте
подробности

 
 
> Подскажите по следующим конструкциям на СИ:, непонятный синтаксис для студента
Alla_student
сообщение Apr 5 2011, 12:54
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 5-04-11
Пользователь №: 64 146



Я начала только заниматься программированием на СИ и встретилась с непонятными записями - конструкциями в исходниках на СИ:

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 * что?

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

Спасибо за внимание.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
rezident
сообщение Apr 5 2011, 13:15
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В начале списка литературы должен стоять стандарт ANSI С99 (ISO/IEC 9899:1999 (E)) wink.gif По ссылке его вариант с несколькими техническими коррекциями.
Затем "библия" - Керниган, Ричи. Язык C
Но можно и в он-лайн справочниках глянуть http://www.opennet.ru/docs/RUS/bogatyrev/gl_2.html
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Apr 5 2011, 13:29
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(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
Никогда не использовал подчеркивание впереди переменных. Правда иногда юзаю чтобы в алфавитных списках такие имена оказывались наверху.

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

По молодости хочется следовать советам из книжек, но потом понимаешь, что следовать логичнее устоявшимся практикам сорсов с которыми больше всего работаешь и собственным психологическим особенностям.
А они могут кардинально противоречить даже самым именитым авторам.
Go to the top of the page
 
+Quote Post
Alla_student
сообщение Apr 5 2011, 16:03
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 5-04-11
Пользователь №: 64 146



Цитата(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пасибо

Сообщение отредактировал Alla_student - Apr 5 2011, 16:02
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 5 2011, 16:19
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 5 2011, 17:09
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(rezident @ Apr 5 2011, 20:19) *
Звездочка ... означает, что это ..
Лейтенант младший biggrin.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01337 секунд с 7
ELECTRONIX ©2004-2016