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

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

04.01.2025, 11:46. Показов 3773. Ответов 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
0 / 0 / 0
Регистрация: 24.01.2026
Сообщений: 1
24.01.2026, 23:20
Студворк — интернет-сервис помощи студентам
А я вообще пытаюсь заменить Си

Вот таким кодом
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Main {
    public static void main() {
        System.setParam(RTOSParam.CORE_FREQ, 16);
        System.setParam(RTOSParam.STDIO_PORT, GPIO.PC4);
        System.setParam(RTOSParam.SHOW_WELCOME, 0x00);
        System.setParam(RTOSParam.HALT_OK_MODE, HaltMode.HALT);
        System.setParam(RTOSParam.HALT_ERR_MODE, HaltMode.HALT);
 
        cstr textReady="Ready!\n";
        cstr textGot="got:";
        System.out(textReady);
        while(true) {       
            byte ch = System.in();
            System.out(textGot);
            System.outChar(ch);
            System.outChar('\n');
        }
    }
}
Или вот таким:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
class Main {
    public exception Test1Exception extends Exception {
        TEST0,
        TEST1;
    }
 
    public exception Test2Exception extends Test1Exception {
        TEST1,
        TEST3;
    }
 
    public static byte divTest(byte value) throws MathException {
        byte b=1;
        b--;
        return value / b;
    }
 
    public static void test() throws MathException {
        DivByZeroException.throw();
    }
 
    public static void runtimeTest() {
        RuntimeException.throw();
    }
 
    public static void main() {
        System.setParam(RTOSParam.CORE_FREQ, 16);
        System.setParam(RTOSParam.ACTLED_PORT, GPIO.PB1);
        System.setParam(RTOSParam.STDIO_PORT, GPIO.PB2);
        System.setParam(RTOSParam.SHOW_WELCOME, 0x01);
        System.setParam(RTOSParam.INIT_DELAY, 1);
        System.setParam(RTOSParam.HALT_OK_MODE, HaltMode.HALT);
        System.setParam(RTOSParam.HALT_ERR_MODE, HaltMode.BLINK_N_RESET);
 
        try {
            test();
        }
        catch(MathOverflowException ex) {
            System.out(1);
        }
        catch(DivByZeroException ex) {
            System.out(2);
        }
        catch(Test1Exception ex) {
            System.out(3);
        }
        catch(MathException ex) {
            System.out(4);
        }
        catch(RuntimeException ex) {
            System.out(5);
        }
 
 
        try {
            runtimeTest();
        }
        catch(MathException ex) {
            System.out('@');
        }
        catch(RuntimeException ex) {
            System.out(' ');
        }
        catch(Exception ex) {
            System.out('!');
        }
 
        try {
            Test2Exception.throw(Test2Exception.TEST1);
        }
        catch(Exception ex) {
            System.out(1);
        }
 
        try {
            for(byte f=0;; f++) {
                System.out(f);
            }
        }
        catch(MathException ex) {
            System.out(ex.typeId());
            System.out(ex.code());
            System.out(ex);
        }
 
        try {
            System.out(divTest(10));
            MathOverflowException.throw();
        }
        catch(DivByZeroException, MathOverflowException, DivByZeroException ex) {
            System.out(10);
        }
        catch(MathException ex) {
            System.out(11);
        }
    }
}
Или таким:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Main {
    public static void main() {
        System.setParam(RTOSParam.CORE_FREQ, 16);
        System.setParam(RTOSParam.STDIO_PORT, GPIO.PC4);
        System.setParam(RTOSParam.SHOW_WELCOME, 0x01);
 
        byte port = GPIO.PB2;
        GPIO.modeOut(port);
        while(true) {
            Thread.waitMS(20);
            GPIO.invert(port);
        }
    }
}
Ну и таким тоже:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Main {
    public interface Number {
        byte toByte();
        short toShort();
    }
 
    public class Short implements Number {
        private short   value;
 
        public Short(short value) {
            this.value = value;
        }
 
        public Number getThis() {
            return this;
        }
 
        public byte toByte() {return (byte)value;}
        public short toShort() {return value;}
    }
 
    public static void main() {
        System.setParam(RTOSParam.CORE_FREQ, 16);
        System.setParam(RTOSParam.STDIO_PORT, GPIO.PB2);
        System.setParam(RTOSParam.SHOW_WELCOME, 0x01);
 
        Object num = new Short(0x0102);
        if(num is Short as s) {
            System.out(s.toShort());
            System.out(" is short\n");
            
            if(s.getThis() is Short as s2) {
                System.out("Is short too\n");
            }
        }
    }
}
Проект в альфа стадии, но пообсуждать можно
https://github.com/w5277c/vm5277
https://vm5277.ru/

Если кратко, это мультиплатформенный ООП язык похожий на Java но без VM, транслируемый в asm без участия Си со своей RTOS и большим набором крутых фич.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2026, 23:20

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
61
Ответ Создать тему
Новые блоги и статьи
Установка 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