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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Ivanoff-iv писал(а):про несколько нажатых кнопок - этот алгоритм их различит только если все они находятся в одной строке или в одном столбце, иначе запутается.
допустим, я нажал кнопку на пересечении 1-го столбца и 1-й строки и 2-го столбца 3-й строки.
на строках я получу 1100, на столбцах 1010 - и эта комбинация никакими другими комбинациями кнопок не повторится. так что 2 одновременно нажатые кнопки ВСЕГДА будут определены корректно. на счет 3-х уже не уверен, но могу вечером поэкспериментировать в протеусе :)

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

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

что интересно... "сканкод" при сканировании клавиатуры 4х4 набирается на 2 байта, а при координатном умещается в 1байт.
_______
1;1 и 2;3 != 1;3 и 2;1. а сканкод будет одинаков == 1100;1010 :)
Последний раз редактировалось Ivanoff-iv Чт фев 21, 2019 07:35:25, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Ivanoff-iv писал(а):1;1 и 2;3 == 1;3 и 2;1. сканкод будет 1100;1010
да... вы правы. :oops: погорячился я.
но все равно неплохой алгоритм. и разных комбинаций поддерживает достаточно для практического применения.
во всяком случае, свою нишу в применении вполне может иметь :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

согласен - алгоритм изумительный :beer: (и для матричных клавиатур, в которых нет диодов подходит даже лучше), потому и считаю, что у него должно быть название :write:
пс: я написание примера поправил, а то не очень понятно выглядело...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Ivanoff-iv писал(а):у него должно быть название
ну... в принципе, не стоит... я скромный... но спасибо. алгоритм имени ARV - звучит :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

такой алгоритм уж давно известен - AVR243
Клавиатурные матрицы могут сканироваться несколькими способами. Если может быть нажата только одна кнопка, то выбирается быстрый способ сканирования, при котором одновременно выбираются (устанавливается низкое значение) все строки, и считывается состояние столбцов. После этого выбираются все столбцы, и считывается состояния строк. Возвращенные значения столбца и строки объединяются в код, идентифицирующий нажатую кнопку. Этот метод и используется в данном примере применения...
http://www.gaw.ru/html.cgi/adv/app/micr ... AVR243.htm
первоисточник и исходник скачать:
http://www.gaw.ru/html.cgi/adv/app/micros/avr/index.htm
для STM32 тоже работает

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

const uint8_t key_code[] = { 1,   4,   7,  'M',
                             2,   5,   8,   10,
                             3,   6,   9,  '#',
                             'A', 'X', 'B', 'R'
                           };
...
#define ROW1_INPUT GPIOA->MODER &= ~GPIO_MODER_MODER6_0
#define ROW1_OUTPUT GPIOA->MODER |= GPIO_MODER_MODER6_0
#define ROW1 GPIOA->IDR & GPIO_IDR_6  
...
            COL1_INPUT;
            COL2_INPUT;
            COL3_INPUT;
            COL4_INPUT;
            ROW1_OUTPUT;
            ROW2_OUTPUT;
            ROW3_OUTPUT;
            ROW4_OUTPUT;
            if((COL1) == 0) col = 0;
            if((COL2) == 0) col = 4;
            if((COL3) == 0) col = 8;
            if((COL4) == 0) col = 12;
            ROW1_INPUT;
            ROW2_INPUT;
            ROW3_INPUT;
            ROW4_INPUT;
            COL1_OUTPUT;
            COL2_OUTPUT;
            COL3_OUTPUT;
            COL4_OUTPUT;
            if((ROW1) == 0) row = 0;
            if((ROW2) == 0) row = 1;
            if((ROW3) == 0) row = 2;
            if((ROW4) == 0) row = 3;

			key = key_code[col + row];
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

oleg110592 писал(а):такой алгоритм уж давно известен
опередили, суки... :o
Слушайте, что я накропал вчера ночью при колеблющемся свете электрической лампы: «Я помню чудное мгновенье, передо мной явилась ты, как мимолетное виденье, как гений чистой красоты». Правда, хорошо? Талантливо? И только на рассвете, когда дописаны были последние строки, я вспомнил, что этот стих уже написал А. Пушкин. Такой удар со стороны классика! А?
©
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
OKF
Это не хвост, это антенна
Сообщения: 1401
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Это что. Когда то пишу какую-то программулину и чувствую что-то знакомое... Заподозрил. И действительно, оказалось что я это уже писал когда то... Ну, а Пушкин - это само-собой.)))
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

Доброго времени суток. Разбираюсь с указателями на void.
Для обучения создал следующий код:

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

	void *ptr = "Hello, world";
	printf("%s", (char*)ptr);
Компиляция проходит гладко, вижу свою заветную строку.
Решаю провести эксперимент - удаляю приведение указателя к char: printf("%s", ptr)
Компилирую, ожидаю увидеть ошибку, но нет, все проходит успешно, опять вижу заветную строку. Это норма ? Дело в том, что я вывожу через спецификатор %s, и оно все равно приводится к char ?
Последний раз редактировалось Пока_без_кота Пн мар 04, 2019 21:10:40, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

Но так делать "аяяай, низзя" ? Или просто некрасиво ?
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3582757#p3582757"]Компилирую, ожидаю увидеть ошибку, но нет, все проходит успешно, опять вижу заветную строку. Это норма ?[/uquote]
Да. Спецификатор %s указывет функции printf на то, что ей параметром передается указатель на строку. Так она его и интерпретирует. Хоть в указатель на int его преобразуйте - от этого его содержимое не изменится.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

Благодарю.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Тут надо понимать одно - любой указатель, неважно на что указывающий, имеет одну ширину памяти. А void* - универсальный указатель, для каких-либо промежуточных результатов. Либо для неизвестного типа.
И, что самое интересное. В функциях void означает "пустоту". Ничто. ... А вот указатель на void допустим. Когнитивный диссонанс какой-то получается. Особенно у новичков :)))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3582766#p3582766"]Но так делать "аяяай, низзя" ? Или просто некрасиво ?[/uquote]
некрасиво делать void* str = "fgfgf";
и вообще, обилие явных приведений типов в программе настораживает...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

в чем смысл использования отдельного стека данных? многие компиляторы отводят под это дело кусочек ОЗУ... а почему не использовать общий стек? вопрос в контексте микроконтроллеров, у которых нет "разных" ОЗУ и нет защиты блоков ОЗУ от доступа "чужих" процессов.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

Вы бы привели конкретный пример. Потому что почти все компиляторы выделяют весь стек в отдельный сегмент, для возможности управления им редактором связей (linker). А вот чтобы какой-то компилятор выделал отдельные сегменты для стека вызовов и стека данных я даже припомнить не могу.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Изображение
что вот это за DATA STACK?
Изображение
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3583922#p3583922"]что вот это за DATA STACK?[/uquote]Да там один стек. В чём можно убедиться посмотрев типовой IAR AVR .map для таких настроек
Изображение
Спойлер

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

SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
INTVEC               CODE          00000000 - 00000083          84   com    1
?FILL1               CODE          00000084 - 0000008B           8   rel    0
DIFUNCT              CODE          0000008C - 0000008D           2   rel    0
CODE                 CODE          0000008E - 00001285        11F8   rel    1
INITTAB              CODE          00001286 - 00001293           E   rel    0
NEAR_ID              CODE          00001294 - 000012A5          12   rel    0
REGVAR_AN            DATA          0000000E - 0000000F           2   rel    0
ABSOLUTE             DATA               0000001C                     rel    0
                     DATA               0000001D                   
                     DATA               0000001E                   
                     DATA               0000001F                   
                     DATA          00000022 - 00000028           7 
                     DATA          0000002D - 0000002D           1 
                     DATA          0000002F - 0000002F           1 
                     DATA          00000031 - 0000003B           B 
                     DATA          00000044 - 00000045           2 
                     DATA          00000048 - 0000004B           4 
                     DATA          0000004E - 0000004F           2 
                     DATA          00000054 - 00000054           1 
                     DATA          00000056 - 00000057           2 
                     DATA          00000061 - 00000062           2 
                     DATA          00000098 - 0000009D           6 
CSTACK               DATA          00000100 - 0000017F          80   dse    0
RSTACK               DATA          00000180 - 000001BF          40   dse    0
NEAR_I               DATA          000001C0 - 000001D1          12   rel    0
NEAR_Z               DATA          000001D2 - 0000021D          4C   rel    0
EEPROM_I             XDATA              00000000                     dse    0
EEPROM_N             XDATA         00000000 - 0000000C           D   rel    0
AVR_STACK.png
(15.76 КБ) 388 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

что значит один, если четным по серому написано DATA STACK и RETURN ADRESS STACK?
к тому же я вопрос задал после того, как столкнуля именно с ДВУМЯ стеками на практике: параметры функций загоняются в стек данных через указатель, а call-ы и ret-ы, естественно, адресуются через SP, как обычно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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