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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение 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 стоит инициализировать.
Инициализировал!
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

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

А заработало? Кнопки-то работают?
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

Вам нужен модификатор volatile при объявлении переменной BuTTOn.
Интересное явление! При опросе кнопки по прерыванию я не мог перейти в меню, хотя в отладчике все прекрасно было видно значение BuTTON оно соответствовало для перехода,но не происходило.Заем функцию опроса поместил в основной цикл и запретил прерывания. Переход в меню происходил отлично, но мне нужно это делать в прерывании. Вернул все обратно в обработчик и добавил volatile к BuTTON, и о чудо,все заработало!! :)))
Спасибо огромное очень полезными вещами поделились :beer:
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

Спасибо огромное очень полезными вещами поделились
Вот вам будет ещё полезнее почитать:
Archive.zip
(507.46 КБ) 257 скачиваний
:)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

Вот вам будет ещё полезнее почитать:
со вступления уже понял, это то что надо! :write: спасибо!
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

Только не воспринимайте, как догму эти статьи. ;) Особенно в части оформления программы.
Ну и могу ещё посоветовать систему контроля версий поставить. Например, модный сейчас Git (с графическим интерфейсом, например, мне нравится Git Extension). Но это для мелких проектов, возможно, особого смысла не имеет, но для крупных и ветвящихся - это спасение от кучи версий программы. :tea:
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение 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]
Настойчиво посоветовать. :-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

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

что даст static.? то что только по делу можно ее поменять?т.е конкретно там где ее используют?
Практически - скорее всего, компилятор и так будет оперировать указателем
. Тоже так предполагал, казалось этими действиями я понижаю уровень языка!
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

что это значит? если я эту переменную никак не использую по делу,как может программа к ней добраться и побпловаться?
Дело в том, что переменную лучше "запереть" в модуле и изменять/получать значение только через функции этого модуля. Эдакая инкапсуляция.
что даст static.? то что только по делу можно ее поменять?т.е конкретно там где ее используют?
static для имени переменной делает её запертой внутри этого модуля. Доступ к такой переменной через объявление её же через extern в другом модуле не получится.
Тоже так предполагал, казалось этими действиями я понижаю уровень языка!
Не экономьте на спичках. Пишите так, как вам проще и удобнее. Пусть компилятор сам решит, как ему удобно работать с переменной - может, он её в регистре будет держать (впрочем, вашу с volatile не будет :) ).
пока не представляю,что это,но попробую разобраться
Это то, что позволит наглядно представлять и удобно переключаться между версиями вашей программы. Вы делаете "слепки" ("коммиты") рабочего каталога, когда они требуются (с комментариями).
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

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

Это то, что позволит наглядно представлять и удобно переключаться между версиями вашей программы.
хорошо,посмотрю
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

интересный случай!? в моем примере как это должно выглядеть?как мне до нее добраться из другого модуля МЕНЮ? написать функцию в модуле KEY которая просто передает мою переменную,а в модуле меню вызвать эту функцию?
Да. :) unit8_t GetKeyCode(void);
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

Да. :) unit8_t GetKeyCode(void);
ну хорошо получил я ее,теперь мне нужно поменять ее значение в чужом модуле. что тоже писать функцию для этого? разврат какой-то :o
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

ну хорошо получил я ее,теперь мне нужно поменять ее значение в чужом модуле. что тоже писать функцию для этого? разврат какой-то
Нет, не разврат. :) Это инкапсуляция:
Инкапсуляция - это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования
В этой функции вы запретите прерывания, считаете/запишете переменную, снова разрешите прерывания. Для внешнего пользователя всё это не важно - он этого не замечает и не знает тонкостей работы с переменной. Это знает сам модуль.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

В этой функции
Тело этой функции так должно выглядеть?

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

uint8_t GetKeyCode(void)
{
	return BuTTON;
}
но так не работает :dont_know:
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3338804#p3338804"]но так не работает[/uquote]
Что-то не так. Как функцию вызываете?
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение 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; // не ошибка
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3338822#p3338822"]

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

uint8_t f=0;
while (1)
	{   
	f=GetKeyCode();
		if (f) 
		opredelenieUkazatela();  // при наличии кода клавиатуры переходим в меню	
	}
}
[/uquote]
Т.е. функция "переходим в меню" вообще не вызывается? А, кстати, как она узнаёт код кнопки? Раньше получала его параметром - а сейчас?
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

Т.е. функция "переходим в меню" вообще не вызывается?
без volatile не вызывалась, даже значение BuTTON не возвращалось в ф-й GetKeyCode();
А, кстати, как она узнаёт код кнопки? Раньше получала его параметром - а сейчас?
сейчас я в модуле вызываю GetKeyCode снова
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

Здравствуйте!своим наивным расчетом пытаюсь добраться к полю структуры вот таким образом:

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

for (typ8 i=0;i<3;i++)
	{
		TWI_buffer[i]=*(PtrRTC_struct+i);
	}
компилятр пишет : invalid type argument of unary '*' (have 'int') правильно ли я понимаю,что доступ к полю структуры это унарная операция, т.е для доступа нужно использовать только один аргумент.Но я же работаю адресом структуры....или причина не в этом?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ответить

Вернуться в «Разные вопросы по МК»