82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165

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

04.01.2025, 11:46. Показов 4229. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru