Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165

Как вы заменяете удобство классов С++ на СИ, при программировании под МК

04.01.2025, 11:46. Показов 3771. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня.
*(Хотя, кажется в этой ветке сидит одна небольшая группа людей, которые дают ответы на все мои вопросы. Спасибо вам, большое!)

-------------------------------------

В общем, ситуация такая: Начинал я программировать на с++ в arduino ide. Привык к работе с классами их удобству. Но, чтобы отстыковаться от arduino в принципе, начал изучение и потихоньку заменял ардуиовский фукнционал сишным кодом. Все получалось хорошо, пока не дошел до темы классов. До этого думал, что классы легко заменяются стурктурами и будут так же удобны в использовании, да еще и более эффективны.

Но Оказалось, что эффективность теряется, когда, в стремлении за удобством, я каждую функцию "класса" добавляю через указатель в структуру, чтобы было удобно использовать через точку
C
1
structObj.func()
. В этом случае в опертивку будут еще и помещяться указатели фукнций на каждый экземпляр структуры, а это капец жирно.

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

Так же видел варинаты, что к струткуре "класса" прописываются функции, к названию которых добавляется название "класса", чтобы в программе не пересекались имена. И вызывается функция, в которую передается указатель на структуру. Но это же тоже много лишних символов в коде появляется.

--------------------------------------

Проекты у меня большие, разбиваю их на разные файлы по ~300 строк кода, каждый файл это какой-то самостоятельный модуль и реализовывать его через класс, одно удовольствие. В проекте обучно около 10 таких отдельных модулей. Т.е. программа большая.

Но я теперь в тупике и не знаю что делать. Без классов на с++ программа станет сильно менее читаемой. А оставаясь на си, я вроде как теряю какие-то приемущества в низкоуровневости и быстродейсвии СИ на МК.

И в итоге, вопрос: как вы, опытные разработчики МК, решаете этот вопрос? Какие "парадигмы" используете при написании больших программ на СИ? Или вообще на СИ переходит нет прям какой-то необходимости? Или есть?

В общем, прошу, высказать, ваше мнение.

--------------------------------------

*Так же на вопрос "зачем мне вообще использовать классы на мк". У меня кажды программа сильно похожа на предыдущую, только меняется количство подключенной переферии. А сейчас я сделал такую модель , что есть 1 центральный контроллер, и он может общаться с любым количеством дочерних. На каждом дочернем одна программа, которая готова, по команде центрального, создать любой из нужных мне объектов и повесить на нужный пин. Такми образом я имею неограниченое число универсальных пинов, а на всех дочерних платах одинаковй код. И такая универсальность очень тесно завязана на классах. Вот именно, при мыслях о переходе с классов на структуры у меня и возникли проблемы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2025, 11:46
Ответы с готовыми решениями:

В чём удобство классов? (Общая тема (дискуссионная)
Всем, добрый день! Мой вопрос будет общего характера. И кому будет не жалко своего времени, хотелось бы услышать ответ. А вопрос в...

Смерть под обломками за удобство
Хакеры кндр украли 600 млн долларов на строительство ракет ссылка...

Как записать файл объекты разных классов, чтобы при их считывании с файла сохранялись характеристики объектов классов
Никак не могу понять,как это осуществить.Когда я попытался сделать что-то подобное,то после загрузки из файла и выводе на экран...

60
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,367
09.01.2025, 00:22
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А теперь представьте, что один светодиод у вас висит на PA3, второй на PB7, третий на PC1. А на другой отладочной плате их было удобнее развести на PB0, PB4, PB2. Не обеспечивают ваши макросы должной гибкости.
Ну так я же привел код. Вот более полный кусок:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define LOW     CHKBIT(PIND,PD2)
#define HI      CHKBIT(PIND,PD3)
 
#define LOW_BUTT    PA0
#define HI_BUTT     PA1
#define BUTT_PORT   PINA
 
#define BUTT_LOW_PRESS  CHKBIT(BUTT_PORT,LOW_BUTT)
#define BUTT_HI_PRESS   CHKBIT(BUTT_PORT,HI_BUTT)
 
#define RG_PORT PORTB
#define DT  PB2
#define CLK PB1
#define ZD  PB0
 
#define CLK_ON  SETBIT(RG_PORT,CLK)
#define CLK_OFF CLRBIT(RG_PORT,CLK)
#define ZD_ON   SETBIT(RG_PORT,ZD)
#define ZD_OFF  CLRBIT(RG_PORT,ZD)
Порты и пины меняются в одном месте под конкретный проект, конкретную плату.
0
 Аватар для COKPOWEHEU
4147 / 2725 / 433
Регистрация: 09.09.2017
Сообщений: 12,073
09.01.2025, 00:25
Цитата Сообщение от Rius Посмотреть сообщение
Разница в том, что с макросами вы оставляете место для будущих ошибок.
А вы шаблонами. Невелика разница. Причем реальной безопасности они почти не добавляют, только затрудняют чтение.

Добавлено через 1 минуту
Alex1126, у вас форум не обновляется? Три раза одно и то же послали.
0
Эксперт .NET
 Аватар для Rius
13407 / 7860 / 1701
Регистрация: 25.05.2015
Сообщений: 23,873
Записей в блоге: 14
09.01.2025, 00:26
Шаблоны позволяют проверять код компилятору. Левые данные не могут быть подставлены.
А макрос может наворотить.

Добавлено через 33 секунды
Форум глючит.
0
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
09.01.2025, 00:36
Цитата Сообщение от Rius Посмотреть сообщение
Или что данные разных типов были приведены для совершения операции к какому-то типу по разумению компилятора
Или что SETBIT(PORTA, condition ? CS1_BIT : CS2_BIT); делает вовсе не то, что хотел программист, который забыл внутри макроса заключить параметр в скобочки.
0
 Аватар для COKPOWEHEU
4147 / 2725 / 433
Регистрация: 09.09.2017
Сообщений: 12,073
09.01.2025, 00:39
Вам не говорили, что оптимизировать надо узкое место, а не какое попало? И с защитами то же самое. Вы придумали какую-то проблему, которая возникает примерно никогда, и гордитесь, что решили.
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,367
09.01.2025, 00:45
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Alex1126, у вас форум не обновляется? Три раза одно и то же послали.
подвис че то, сорри.

Добавлено через 2 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А теперь перенесите CLK на PC6.
я понимаю о чем вы, что порт тоже надо поменять. Но это не большая проблемма то.
0
 Аватар для COKPOWEHEU
4147 / 2725 / 433
Регистрация: 09.09.2017
Сообщений: 12,073
09.01.2025, 00:46
Цитата Сообщение от Dushevny Посмотреть сообщение
Или что SETBIT(PORTA, n+1); делает вовсе не то, что хотел программист, который забыл внутри макроса заключить параметр в скобочки.
ССЗБ. Чего этот ваш погромист вообще хотел добиться подобным кодом?!
Вы бы лучше предложили удобную настройку таймера или АЦП - где каналы разбросаны по нескольким регистрам. В случае таймера 1,2 в CHCTLR1, а 3,4 в CHCTLR2.
C
1
2
3
4
5
6
7
8
#define IO  A,11,0,GPIO_APP50
  #define TIM 1,4,TIMO_PWM_NINV
 
  GPIO_config(IO);
  timer_init(TIM, 14400-1, 10000-1); //частота тактирования 144 МГц, делитель (14400-1), модуль счета (10000-1)
  timer_chval(TIM) = 1000; //значение сравнения канала 1000
  timer_chcfg(TIM); // настройка выбранного канала. В данном случае TIMO_PWM_NINV - output, PWN, non-inverse
  timer_enable(TIM);
0
Эксперт .NET
 Аватар для Rius
13407 / 7860 / 1701
Регистрация: 25.05.2015
Сообщений: 23,873
Записей в блоге: 14
09.01.2025, 00:46
COKPOWEHEU
Это был ответ на вопрос, что плохого в макросах. Вы можете писать как угодно, никто вас не принуждает. И спросу с вас тоже никакого.

Куб полное зло, а тонны макросов и констант от того же производителя - добро. Их же нам переписать слишком сложно, поэтому примем как есть.
Миниатюры
Как вы заменяете удобство классов С++ на СИ, при программировании под МК   Как вы заменяете удобство классов С++ на СИ, при программировании под МК   Как вы заменяете удобство классов С++ на СИ, при программировании под МК  

0
 Аватар для COKPOWEHEU
4147 / 2725 / 433
Регистрация: 09.09.2017
Сообщений: 12,073
09.01.2025, 00:55
Цитата Сообщение от Alex1126 Посмотреть сообщение
я понимаю о чем вы, что порт тоже надо поменять. Но это не большая проблемма то.
В данном случае это скорее намек вам, что макросы неплохо бы доработать. Например, там есть такая мегаудобная штука, как конкатенация:
C
1
2
3
4
5
6
#define _PORTx(port, ign...) PORT ## port // Поскольку препроцессор работает прежде компилятора, он развернет эту строчку в PORTD. А вот про такую "переменную" компилятор знает.
// Заодно обратите внимание, что это макрос с переменным числом аргументов. Первый попадает в port, остальные в ign - в данном случае они не используются.
#define PORTx(desc) _PORT(desc) // Особенность макроязыка - с первого раза не всегда может правильно развернуть
 
#define LED D,1
PORTx(LED) |= (1<<1);
Добавлено через 2 минуты
Цитата Сообщение от Rius Посмотреть сообщение
Это был ответ на вопрос, что плохого в макросах.
Вот только сам ответ вы привести забыли. Не считать же аргументом против макросов то, что можно защититься от ситуации, возникающей раз в жизни.
Цитата Сообщение от Rius Посмотреть сообщение
Куб полное зло, а тонны макросов и констант от того же производителя - добро. Их же нам переписать слишком сложно, поэтому примем как есть.
В вашем случае наоборот: Куб божественен, а списки констант от производителя полное зло, давайте их перепишем, чтобы ни с чьим другим кодом совместимости не было. Понятия не имею, как у вас это соотносится с тем, что Куб тоже эти дефайны использует...
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,367
09.01.2025, 00:58
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В данном случае это скорее намек вам, что макросы неплохо бы доработать.
Возможно, но на практике я не вижу в этом необходимости. Указать отдельный порт для какого-то пина это все же разовая операция, максимум еще раз изменить если плата переразвелась, но зато остается некая простота и, на мой взгляд, мой вариант проще к понимаю. Так как приходится работать с коллегами у которых разный уровень знаний - мне важна именно простота и понимание кода.
0
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
09.01.2025, 01:03
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы бы лучше предложили удобную настройку таймера или АЦП - где каналы разбросаны по нескольким регистрам. В случае таймера 1,2 в CHCTLR1, а 3,4 в CHCTLR2.
ПДП от STM32 подойдет?

C++
1
2
3
4
5
6
7
8
9
bool dma::is_error() const
{
    return (&DMA_unit->LISR)[DMA_stream_no / 4] & (
          (DMA_stream_no % 4) == 0 ? DMA_LISR_TEIF0 | DMA_LISR_FEIF0 | DMA_LISR_DMEIF0
        : (DMA_stream_no % 4) == 1 ? DMA_LISR_TEIF1 | DMA_LISR_FEIF1 | DMA_LISR_DMEIF1
        : (DMA_stream_no % 4) == 2 ? DMA_LISR_TEIF2 | DMA_LISR_FEIF2 | DMA_LISR_DMEIF2
        :  DMA_LISR_TEIF3 | DMA_LISR_FEIF3 | DMA_LISR_DMEIF3
           );
}
Добавлено через 3 минуты
Цитата Сообщение от Alex1126 Посмотреть сообщение
максимум еще раз изменить если плата переразвелась,
А если нужно выпускать обновления с новыми плюшками в том числе и для уже проданных плат со старой разводкой?
0
Эксперт .NET
 Аватар для Rius
13407 / 7860 / 1701
Регистрация: 25.05.2015
Сообщений: 23,873
Записей в блоге: 14
09.01.2025, 01:05
Вот только сам ответ вы привести забыли.
Ищите выше. Вы же влезли что-то мне доказывать.
Не считать же аргументом против макросов то, что можно защититься от ситуации, возникающей раз в жизни.
Домашним самоделкиным этой проблемы не дано (и нет необходимости) понять.
В вашем случае наоборот: Куб божественен,
В моём случае куб - кодогенератор для демонстрации возможностей чипа и быстрого прототипирования.
и гордитесь, что решили.
А вы очень гордитесь тем, что можете написать hello world компактно под один конкретный контроллер, ставя это в пику кодогенератору Куба. Категорически игнорируя то, что Куб рассчитан на все контроллеры, выпускаемые компанией и предназначен для см выше, и отсюда вся сложность получаемого кода.
Понятия не имею, как у вас это соотносится с тем, что Куб тоже эти дефайны использует...
Мегатонны макросов и констант. Но вы им верите безусловно. Потому что иначе пришлось бы переписать и их, но это уже слишком сложно.
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,367
09.01.2025, 01:35
Цитата Сообщение от Dushevny Посмотреть сообщение
А если нужно выпускать обновления с новыми плюшками в том числе и для уже проданных плат со старой разводкой?
это о любому будет две разные прошивки. Дефайном указываем версию платы, под нее настраиваем пины. Меняем дефайн - компилируем. Еще можно в репозитории завести две ветки для разных версий.

Я не утверждаю что мой вариант самый верный. Я хотел лишь показать как дефайны могут несколько упростить жизнь.
0
Native x86
Эксперт Hardware
 Аватар для quwy
6860 / 3792 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
09.01.2025, 01:41
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Жаль только, макроязык в Си такой примитивный. Там ведь даже условий нет.
Практика показывает, что это к лучшему. Использовать библиотеки, насыщенные макросами (даже в рамках C-шного множества возможностей) зачастую крайне неприятно.

Макросы, состоящие из других макросов, содержащих в составе третьи макросы, выглядят круто и удобно. Но только до тех пор, пока ты где-то не ошибся. Банальный баланс скобок в выражении не свел, например. И все, пипец: вместо внятного сообщения о незакрытой скобке, компилятор вываливает тебе килобайты текста об ошибках, потому что из-за чертовой скобки развалился синтаксис тысяч строк макросов.

И, стоит, заметить, что это еще в последние годы ситуация сильно улучшилась, потому что компилятор научили хотя бы разворачивать "стек" макросов, в результате чего среди многих килобайт выхлопа в stderr упоминание проблемного места хотя бы номинально присутствует. Раньше с этим было сильно хуже, компилятор просто показывал конечные синтаксические ошибки уже после разворачивания макросов, и среди них ссылки на корень проблемы вообще не было ни в каком виде.
1
 Аватар для COKPOWEHEU
4147 / 2725 / 433
Регистрация: 09.09.2017
Сообщений: 12,073
09.01.2025, 10:49
Цитата Сообщение от Alex1126 Посмотреть сообщение
Возможно, но на практике я не вижу в этом необходимости. Указать отдельный порт для какого-то пина это все же разовая операция
Это пока разовая. А когда будет несколько плат, по-разному разведенных, уже захочется удобства. Да и в"драйвера" пробрасывать удобнее будет.
Цитата Сообщение от Dushevny Посмотреть сообщение
ПДП от STM32 подойдет?
В массив вы их сами организовали или ST гарантируют?
И в любом случае на Си можно сделать точно так же.
Цитата Сообщение от Rius Посмотреть сообщение
Ищите выше. Вы же влезли что-то мне доказывать.
Вот не надо переводить стрелки. Это вы влезли со своим фанатизмом, что С++ во всем и всегда лучше Си. И искать за вас доказательства ваших слов я не собираюсь.
Цитата Сообщение от Rius Посмотреть сообщение
Категорически игнорируя то, что Куб рассчитан на все контроллеры, выпускаемые компанией
Сейчас я разбираюсь с ch32. Толку мне с вашего куба? Вот знания, полученные при программировании smt32 на регистрах - те да, пригодились.
Цитата Сообщение от Rius Посмотреть сообщение
Мегатонны макросов и констант. Но вы им верите безусловно. Потому что иначе пришлось бы переписать и их, но это уже слишком сложно.
Прекращайте проецировать свой подход на окружающих. То, что вы слепо верите разработчикам Куба и впадаете в ступор как только он работает не так, как ожидалось, не значит, что и окружающие таковы.
Цитата Сообщение от quwy Посмотреть сообщение
Банальный баланс скобок в выражении не свел, например.
Это-то всплывает при первом тестировании. Опять вы не там проблему ищите.
Цитата Сообщение от quwy Посмотреть сообщение
Использовать библиотеки, насыщенные макросами (даже в рамках C-шного множества возможностей) зачастую крайне неприятно.
А насыщенные шаблонами - просто невозможно. Ну вот не собирает Си-шный компилятор их и все. А макросы собирает. И плюсовый их собирает, причем точно так же.
0
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
09.01.2025, 11:17
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В массив вы их сами организовали или ST гарантируют?
Си гарантирует. И плюсы тоже. Вы, видимо, не обратили на "&" перед регистром.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И в любом случае на Си можно сделать точно так же.
Да, можно. Это замечание к чему вообще? Подошло?
0
 Аватар для COKPOWEHEU
4147 / 2725 / 433
Регистрация: 09.09.2017
Сообщений: 12,073
09.01.2025, 11:40
Цитата Сообщение от Dushevny Посмотреть сообщение
Си гарантирует. И плюсы тоже. Вы, видимо, не обратили на "&" перед регистром.
То есть убедились, что регистры идут последовательно и можно рискнуть обращаться к ним как к массиву. Ну, за неимением лучшего вполне себе решение.
Цитата Сообщение от Dushevny Посмотреть сообщение
Да, можно. Это замечание к чему вообще?
Ну, у нас тут дискуссия: фанатики утверждают, что С++ во всем лучше Си. Вот только вменяемых аргументов привести никак не могут, ограничиваясь мифической "защитой от опечаток". Я ж для этого и предложил им реализовать что-то чуть менее тривиальное - желательно когда имя регистра конструируется на лету. При помощи их любимого инструмента.
В принципе, DMA действительно тоже неплохо для примера. Там проблема в том, чтобы прописать какая периферия к каким каналам привязана и как включается - отключается. И еще было бы неплохо контролировать не пересекаются ли каналы (но тут возможны варианты). У меня делается примерно так:
C
1
2
3
#define TIM_DMA_1_4     1,4,do{TIM1->DMAINTENR |= TIM_CC4DE;}while(0),do{TIM1->DMAINTENR &=~ TIM_CC4DE}while(0)
#define TIM_DMA_2_3     1,1,do{TIM2->DMAINTENR |= TIM_CC3DE;}while(0),do{TIM2->DMAINTENR &=~ TIM_CC3DE}while(0)
#define SPI2_DMA_TX 1,5,do{SPI2->CTLR2 |= SPI_CTLR2_TXDMAEN;}while(0),do{SPI2->CTLR2 &=~ SPI_CTLR2_TXDMAEN;}while(0)
0
Эксперт .NET
 Аватар для Rius
13407 / 7860 / 1701
Регистрация: 25.05.2015
Сообщений: 23,873
Записей в блоге: 14
09.01.2025, 15:46
Вот не надо переводить стрелки. Это вы влезли со своим фанатизмом, что С++ во всем и всегда лучше Си. И искать за вас доказательства ваших слов я не собираюсь.
Я сказал, что вот такие макросы у нас не позволены. Меня спросили (не вы), почему так. Я ответил.
Всё остальное уже вы набросали на вентилятор
А насыщенные шаблонами - просто невозможно. Ну вот не собирает Си-шный компилятор их и все.
Одно дело, когда выбора компиляторов просто нет. А другое - цепляться за древность в попытке что-то якобы сэкономить, наплевав на потенциальные баги.
Можно же и на ассемблер перейти. Некоторые всё время пишут на асме и презирают этих тупых сишников и выше, которые не умеют в низкоуровневый код.
Сейчас я разбираюсь с ch32. Толку мне с вашего куба? Вот знания, полученные при программировании smt32 на регистрах - те да, пригодились.
Вызовы на базе готовых определений, предоставленных производителем? Ну это же по феншую велосипедистов (привет pgb), отрицающих готовое, ну в самом-то деле. Правильно было бы выписать каждый регистр вручную...
Вас не обязываю учитывать ту информацию, что я сообщил о макросах. Вы стоящих за ними проблем у себя никогда и не встретите, так что ничего страшного. А кому будет интересно, тем может пригодиться.
0
 Аватар для COKPOWEHEU
4147 / 2725 / 433
Регистрация: 09.09.2017
Сообщений: 12,073
09.01.2025, 16:52
Цитата Сообщение от Rius Посмотреть сообщение
А другое - цепляться за древность
Стандарт 23 года - древность?
Цитата Сообщение от Rius Посмотреть сообщение
Можно же и на ассемблер перейти. Некоторые всё время пишут на асме и презирают этих тупых сишников и выше, которые не умеют в низкоуровневый код.
Знать ассемблер != писать на нем вообще все. Тех, кто считает себя профессионалом в контроллерах, но боится ассемблера, презирают более чем заслужено.
Цитата Сообщение от Rius Посмотреть сообщение
Правильно было бы выписать каждый регистр вручную...
Учитывая, что кроме вас никто такой дичи не предлагал, придется считать это самоиронией...
Цитата Сообщение от Rius Посмотреть сообщение
Вас не обязываю учитывать ту информацию, что я сообщил о макросах. Вы стоящих за ними проблем у себя никогда и не встретите
Вот нет бы сразу сказать, что проблемы, с которыми вы боретесь, относятся к какой-то экзотической области.
На самом деле, если бы вы пользовались макросами более активно, вы бы знали их настоящие проблемы. И некоторые из них и правда решаются шаблонами и тому подобным.
Я даже пример приведу: формирование USB-HID дескриптора. Там есть семейство параметров, которые принимают 0-3 байта в качестве аргумента. Например, USAGE_MINIMUM. Если мы хотим ему передать 0x12, то последовательность байтов будет 0x18, 0x12. Если 0x1234, то 0x19, 0x34, 0x12. Если 0x123456, то 0x20, 0x56, 0x34, 0x12. Так вот, макросы, похоже, физически неспособны ни узнать размер аргумента, ни развернуться в разное количество байтов.
---
Кстати о проверках. Если уж очень хочется добавить проверку типов данных, ничего невозможного в этом нет:
C
1
2
3
4
5
#include <stdio.h>
#define sum(a,b) ( 1 ? ((a)+(b)) : ((int(*)(int,int))NULL)(a,b) )
int main(){
  int x = sum(1, NULL);
}
Вот только, как было сказано уже не раз - это настолько редкая ситуация, что практически никто не заморачивается.
Цитата Сообщение от Rius Посмотреть сообщение
А кому будет интересно, тем может пригодиться.
Вы бы, чтобы кого-то заинтересовать, хоть один пример привели бы. Либо когда С++ специфика оказывается существенно безопаснее, либо существенно гибче, либо существенно проще. Реальный пример, а не мифическую "страховку от опечаток".
0
10.01.2025, 04:30

Не по теме:

По поводу классов в МК, что то поговорка вспомнилась, чем больше проводов - тем больше замыканий :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2025, 04:30

Как рассчитываются задержки в функции Delay_ms при программировании на ATmega32?
Добрый день! Подскажите, пожалуйста, как рассчитываются задержки... В microC есть функция Delay_ms. Например, Delay_ms(11). Она...

Что в программировании подразумевается под объединением?
Здравствуйте,что в программировании считается объединением? 1)5 пункт.Что подразумевается под объединением P? просто последовательная...

Пропадает гаджет-часы при изменении масштаба шрифтов и значков (Удобство чтения с экрана)
Драстя. Столкнулся с неприятной байдой: спарва я поместил гаджеты календаря и часов. Решил все увеличить чтоб глаза не напрягать, но при...

Программировании сенсорного дисплея для планшетного компьютера под Windows 7
Прощу прощенья если вопрос задан не в том разделе. Но я не знаю какой именно язык программирования мне необходим, да и к софту вопрос не...

Как лучше делить приложение при программировании в WF? А то кодовая каша получается. Вообще читать невозможно
Как лучше делить приложение при программировании в WF? А то кодовая каша получается. Вообще читать невозможно.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru