Страница 269 из 386

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 14:07:52
ROMan2947
Тогда там и держите. :)
перенес и сразу понадобилось использовать extern!В обработчике то не видать адреса BuTTON.

Вот чтобы вас не пугать и не запутать, я и стёр то, что написал. :)
Не беспокойтесь - для прерываний это не важно - пока вы не выйдете из прерывания, основная программа не продолжится. Но в настоящих многопоточных приложениях просто имейте это в виду. ;) Подробности вы прочтете в "Барьеры памяти и компилятора". Например, тут: http://scrutator.me/post/2015/05/16/mem ... riers.aspx
Ознакомлюсь спасибо!!

На практике в модуле key.h вы пишете после #include
extern uint8_t BuTTON;

И дальше работаете с этой переменной, как с глобальной.

После #include пишем extern uint8_t BuTTON; ???
попробовал без #include видится нормально.
Предупреждения и не будет. Это не ошибка. Кстати, у вас этот самый BuTTON стоит инициализировать.
Инициализировал!

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 14:11:44
da-nie
перенес и сразу понадобилось использовать extern!В обработчике то не видать адреса BuTTON.
Это нормально. :)
После #include пишем extern uint8_t BuTTON; ???
попробовал без #include видится нормально.
Не-не, я имел в виду, в машем модуле после написанных #include. :)

А заработало? Кнопки-то работают?

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 14:14:33
ROMan2947
Вам нужен модификатор volatile при объявлении переменной BuTTOn.
Интересное явление! При опросе кнопки по прерыванию я не мог перейти в меню, хотя в отладчике все прекрасно было видно значение BuTTON оно соответствовало для перехода,но не происходило.Заем функцию опроса поместил в основной цикл и запретил прерывания. Переход в меню происходил отлично, но мне нужно это делать в прерывании. Вернул все обратно в обработчик и добавил volatile к BuTTON, и о чудо,все заработало!! :)))
Спасибо огромное очень полезными вещами поделились :beer:

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 14:18:37
da-nie
Спасибо огромное очень полезными вещами поделились
Вот вам будет ещё полезнее почитать:
Archive.zip
(507.46 КБ) 261 скачивание
:)

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 14:28:12
ROMan2947
Вот вам будет ещё полезнее почитать:
со вступления уже понял, это то что надо! :write: спасибо!

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 14:35:57
da-nie
Только не воспринимайте, как догму эти статьи. ;) Особенно в части оформления программы.
Ну и могу ещё посоветовать систему контроля версий поставить. Например, модный сейчас Git (с графическим интерфейсом, например, мне нравится Git Extension). Но это для мелких проектов, возможно, особого смысла не имеет, но для крупных и ветвящихся - это спасение от кучи версий программы. :tea:

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 14:55:58
Siarzhuk
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3338622#p3338622"]Где нужно помещать обработчик прерывании,[/uquote]
Там, где это позволит свести к минимуму внешние связи модуля. Чем меньше из него "торчит" наружу, тем надёжнее и предсказуемее работа. extern в чистой С-программе - это форс-мажор - давить нещадно, для функций он бессмысленен, для переменных - даёт всем кому не лень такую свободу обращения с вашими данными, которой окружающие не заслуживают, да и делает переменную уже никак не вашей - потому как контроля над тем, кто с ней побаловался, когда и как - у вас уже не будет. Резюме перфекциониста: Обработчик - в модуль клавиатуры вместе с известной переменной, которую делаем статической а кто хочет её почитать - пожалте им функцию get_cur_button. Ну и сказать оптимизатору - "Выноси, родима-а-й!"

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3338622#p3338622"]В чем разница использования внешней переменной и работать просто с адресом переменной?[/uquote]
Теоретически [для встроенных типов размером меньше размера указателя] - в дополнительной операции разыменования для получения содержимого по адресу. Практически - скорее всего, компилятор и так будет оперировать указателем. Ну и для ясности понимания кода, тот кто будет его читать после вас наверняка подумает, что есть причина использования именно указателя вместо переменной - и потратит время на поиски этой причины. Пишите проще - и сами-же себе спасибо скажете через пару годиков, будь придётся нынешний код ещё куда встраивать.

Добавлено after 6 minutes 7 seconds:
[uquote="da-nie",url="/forum/viewtopic.php?p=3338694#p3338694"]Ну и могу ещё посоветовать систему контроля версий поставить.[/uquote]
Настойчиво посоветовать. :-)

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 15:44:11
ROMan2947
[uquote="da-nie",url="/forum/viewtopic.php?p=3338694#p3338694"]Ну и могу ещё посоветовать систему контроля версий поставить.[/uquote] пока не представляю,что это,но попробую разобраться :tea:
для переменных - даёт всем кому не лень такую свободу обращения с вашими данными, которой окружающие не заслуживают, да и делает переменную уже никак не вашей - потому как контроля над тем, кто с ней побаловался....
что это значит? если я эту переменную никак не использую по делу,как может программа к ней добраться и побпловаться?
Обработчик - в модуль клавиатуры вместе с известной переменной, которую делаем статической

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

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 15:54:12
da-nie
что это значит? если я эту переменную никак не использую по делу,как может программа к ней добраться и побпловаться?
Дело в том, что переменную лучше "запереть" в модуле и изменять/получать значение только через функции этого модуля. Эдакая инкапсуляция.
что даст static.? то что только по делу можно ее поменять?т.е конкретно там где ее используют?
static для имени переменной делает её запертой внутри этого модуля. Доступ к такой переменной через объявление её же через extern в другом модуле не получится.
Тоже так предполагал, казалось этими действиями я понижаю уровень языка!
Не экономьте на спичках. Пишите так, как вам проще и удобнее. Пусть компилятор сам решит, как ему удобно работать с переменной - может, он её в регистре будет держать (впрочем, вашу с volatile не будет :) ).
пока не представляю,что это,но попробую разобраться
Это то, что позволит наглядно представлять и удобно переключаться между версиями вашей программы. Вы делаете "слепки" ("коммиты") рабочего каталога, когда они требуются (с комментариями).

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 16:08:21
ROMan2947
Дело в том, что переменную лучше "запереть" в модуле и изменять/получать значение только через функции этого модуля. Эдакая инкапсуляция.
интересный случай!? в моем примере как это должно выглядеть?как мне до нее добраться из другого модуля МЕНЮ? написать функцию в модуле KEY которая просто передает мою переменную,а в модуле меню вызвать эту функцию?
static для имени переменной делает её запертой внутри этого модуля. Доступ к такой переменной через объявление её же через extern в другом модуле не получится.
действительно, попробовал так, extern не канает уже...
Пишите так, как вам проще и удобнее.
ок

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

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 16:09:29
da-nie
интересный случай!? в моем примере как это должно выглядеть?как мне до нее добраться из другого модуля МЕНЮ? написать функцию в модуле KEY которая просто передает мою переменную,а в модуле меню вызвать эту функцию?
Да. :) unit8_t GetKeyCode(void);

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 16:20:22
ROMan2947
Да. :) unit8_t GetKeyCode(void);
ну хорошо получил я ее,теперь мне нужно поменять ее значение в чужом модуле. что тоже писать функцию для этого? разврат какой-то :o

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 16:23:43
da-nie
ну хорошо получил я ее,теперь мне нужно поменять ее значение в чужом модуле. что тоже писать функцию для этого? разврат какой-то
Нет, не разврат. :) Это инкапсуляция:
Инкапсуляция - это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования
В этой функции вы запретите прерывания, считаете/запишете переменную, снова разрешите прерывания. Для внешнего пользователя всё это не важно - он этого не замечает и не знает тонкостей работы с переменной. Это знает сам модуль.

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 17:12:23
ROMan2947
В этой функции
Тело этой функции так должно выглядеть?

Код: Выделить всё

uint8_t GetKeyCode(void)
{
	return BuTTON;
}
но так не работает :dont_know:

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 17:34:41
Siarzhuk
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3338804#p3338804"]но так не работает[/uquote]
Что-то не так. Как функцию вызываете?

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 17:37:53
ROMan2947
[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3338820#p3338820"]Как функцию вызываете?[/uquote]

Код: Выделить всё

while (1)
	{   
	
		if (GetKeyCode()) 
		opredelenieUkazatela();  // при наличии кода клавиатуры переходим в меню	
	}
}

Код: Выделить всё

uint8_t f=0;
while (1)
	{   
	f=GetKeyCode();
		if (f) 
		opredelenieUkazatela();  // при наличии кода клавиатуры переходим в меню	
	}
}

static uint8_t BuTTON=0; //ошибка

static volatile uint8_t BuTTON=0; // не ошибка

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 18:35:31
Siarzhuk
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3338822#p3338822"]

Код: Выделить всё

uint8_t f=0;
while (1)
	{   
	f=GetKeyCode();
		if (f) 
		opredelenieUkazatela();  // при наличии кода клавиатуры переходим в меню	
	}
}
[/uquote]
Т.е. функция "переходим в меню" вообще не вызывается? А, кстати, как она узнаёт код кнопки? Раньше получала его параметром - а сейчас?

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс мар 25, 2018 18:41:15
ROMan2947
Т.е. функция "переходим в меню" вообще не вызывается?
без volatile не вызывалась, даже значение BuTTON не возвращалось в ф-й GetKeyCode();
А, кстати, как она узнаёт код кнопки? Раньше получала его параметром - а сейчас?
сейчас я в модуле вызываю GetKeyCode снова

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт мар 30, 2018 13:15:30
ROMan2947
Здравствуйте!своим наивным расчетом пытаюсь добраться к полю структуры вот таким образом:

Код: Выделить всё

for (typ8 i=0;i<3;i++)
	{
		TWI_buffer[i]=*(PtrRTC_struct+i);
	}
компилятр пишет : invalid type argument of unary '*' (have 'int') правильно ли я понимаю,что доступ к полю структуры это унарная операция, т.е для доступа нужно использовать только один аргумент.Но я же работаю адресом структуры....или причина не в этом?

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт мар 30, 2018 13:22:55
ARV
не понял, какие типы переменных у вас.
не увидел доступа к полю структуры...
поясните тонкости