Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/16: Рейтинг темы: голосов - 16, средняя оценка - 4.69
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149

Массив переменной длины, инициализирующийся при компиляции

10.06.2022, 17:48. Показов 3829. Ответов 63
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех. Вопрос, наверное, элементарный. Но я банально не знаю, что вбить в Яндекс. В коллекции решенных задач такого не нашел. Если такая тема уже была, бросьте ссылку, плиз.

Допустим, есть класс. Внутри класса должен быть массив.

C++
1
2
3
4
5
6
7
    class NewClass
    {
        byte array[100];
    };
 
    NewClass a;
    NewClass b;
Как сделать так, чтобы переменные a и b имели разную длину массива? Нужно что-то типа:

C++
1
2
    NewClass a(10);
    NewClass b(10000);
Важно! Код предназначен для микроконтроллера, там ограниченный объем оперативной памяти, поэтому динамическое выделение под запретом. Переменные a и b должны быть размечены в памяти на этапе компиляции. Поэтому структура типа List<T> в C#, которая может менять свой размер, не подойдет.

С++ только начал изучать, до этого много работал на C. Там такое невозможно, только так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    typedef struct
    {
        byte* data;
        int dataSize;
        
    } NewType
 
 
    byte rawData_a[10];
    byte rawData_b[10000];
 
    NewType a = 
    {
        .data = rawData_a,
        .dataSize = sizeof(rawData_a)
    }
    
    NewType b = 
    {
        .data = rawData_b,
        .dataSize = sizeof(rawData_b)
    }
Все это можно завернуть в одну строку макросами. Но сложные макросы - зло при отладке кода.

Надеюсь, в C++ есть более элегантное решение?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.06.2022, 17:48
Ответы с готовыми решениями:

Массив переменной длины
Здравствуйте форумчане. Написал программу для копирования содержимого одного массива в другой. Массивы переменной длины. #include...

массив переменной длины
Как в С++ сделать массив переменной длины (увеличивающийся), чтобы сохранялись хранящиеся там данные? Покопался, но нигде не могу найти. ...

Передать в C# массив переменной длины.
Привет форумчане. Подскажите как передать в С# из dll-ки массив заранее не известного размера. Dllка генерит массив не извесного...

63
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
11.06.2022, 01:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Это какой-то совсем грязный хак. Хоть в эмбедде, хоть где - так делать не рекомендую.
Для структур без констракторов это даже не хак, на этом printf(const char*, .. ) сделан.
Все-таки C/C++ гарантирует что элементы массива будут в памяти по порядку.

И потом, разве эмбедники/эмбедчики (не знаю, как верно) не делают постоянно крутые хаки, чтобы марсоходы и спутники могли вытворять вещи, первоначально не задуманные?

Может, я слишком фантазирую про область, с которой сам не сталкивался.

Добавлено через 2 минуты
Еще есть вариант с placement new, где сам задаешь куда положить объект. Все конструкторы/деструкторы будут работать.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
11.06.2022, 01:13
Цитата Сообщение от Folian Посмотреть сообщение
А в каких случаях это может быть полезным?
Внешний вид кода. Стилистический рефакторинг.

В частности часть кода стандартной библиотека именно так и написана. Чтобы не загромождать огромными функциями объвления классов.
1
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
11.06.2022, 01:30
Цитата Сообщение от DrOffset Посмотреть сообщение
Внешний вид кода. Стилистический рефакторинг.
Только стилистика?

С разделением реализаций-то я угадал хоть? Интересовал просто именно практический смысл.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
11.06.2022, 01:43
Цитата Сообщение от Folian Посмотреть сообщение
Интересовал просто именно практический смысл.
Вообще в больших проектах стилистика имеет именно практический смысл.

Цитата Сообщение от Folian Посмотреть сообщение
С разделением реализаций-то я угадал хоть?
Такое встречается, но редко.
1
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
11.06.2022, 02:08
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще в больших проектах стилистика имеет именно практический смысл.
Не, про стилистику я всегда обеими руками в проектах любой величины.

Уточнял лишь на предмет возможных фишек, о которых не догадывался.
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
14.09.2022, 14:49  [ТС]
Всем добрый день, опять нужен совет.

Опять наступил на грабли. Создал кастомный буфер.
C++
1
2
3
4
5
6
7
template <int size>
class Buff
{
    uint8_t rawData[size];
    
    // тут много всяких функций по работе с этим rawData.
};
Все ОК, создал класс, создал объекты класса, все работает.
C++
1
2
Buff<100> buff1;
Buff<1000> buff2;
И вот захотел передать ссылку на этот буфер в другую функцию. Опаньки, не работает:

C++
1
2
3
4
5
6
void Func1(Buff* buff);
 
void main(void)
{
    Func1(&buff1);       // не компилируется
}
Погуглил, примерно понял, по итогу переписал вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Buff
{
    uint8_t rawData[1];
 
    // тут много всяких функций по работе с этим rawData.
};
 
 
 
template <int size>
class BuffT : public Buff
{
    uint8_t rawData[size];
};
Так заработало:

C++
1
2
3
4
5
6
7
8
9
10
11
12
BuffT<100> buff1;
BuffT<1000> buff2;
 
void Func1(Buff* buff)
{
 
}
 
void main(void)
{
    Func1(&buff1);
}
В целом проблема решена, но осталось ощущение какого-то костыля. Может, есть какое-то правильное изящное решение?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
14.09.2022, 16:16
Цитата Сообщение от QueryMonkey Посмотреть сообщение
Я бы ожидал что будет наоборот. "Статическое выделение под запретом, потому что не хватает".
Динамическую можно освободить чтоб другим досталось.
Динамическая память нужна при неопределимом заранее размере входных данных.
Но код для эмбедед обычно более утилитарен, нам нет "непонятно какого размера приехавшего json".
Например, массив - это может быть просто состояние кнопок панели управления.
В модели изделия ABC100 кнопок на панели 10, а в аналогичной модели ABC100 Lux этих кнопок 15 (функций больше).
Т.е. "динамичность" размера массива нам как бы нужна, но при сборке прошивки под ту или другую модель мы точно знаем размер этого массива ужа не этапе компиляции.

Добавлено через 41 минуту
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
В целом проблема решена, но осталось ощущение какого-то костыля.
Проблема даже не в костыле. Проблема в том, что внутри Func1() вы не знаете и не можете узнать (при такой реализации) какого размера буфер у переданного внутрь неё объекта.

Я бы в случае такой необходимости внутрь Func1() передавал не объект, а указатель на его внутренний буфер и сохраненный в объекте размер.

Примерно что-то такое:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <int size>
class Buff
{
public:
    uint8_t m_rawData[size];
    static constexpr int m_size{size};
    
    // тут много всяких функций по работе с этим rawData.
};
 
void Func1(uint8_t rawData[], int size)
{
    for(int i = 0; i < size; ++i)
        rawData[i] = 8;
}
 
int main()
{
    Buff<100> bb;
    Func1(bb.m_rawData, bb.m_size);
    Buff<500> cc;
    Func1(cc.m_rawData, cc.m_size);
Добавлено через 12 минут
Не, во как надо сделать, вообще красиво!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template <int size>
class Buff
{
public:
    uint8_t m_rawData[size];
    static constexpr int m_size{size};
    
    // тут много всяких функций по работе с этим rawData.
};
 
template <int size>
void Func1(Buff<size> &buff)
{
    for(int i = 0; i < buff.m_size; ++i)
        buff.m_rawData[i] = 59;
}
 
int main()
{
    Buff<100> bb;
    Func1(bb);
 
    Buff<500> cc;
    Func1(cc);
Тогда в Func1() передаем просто только объект (по ссылке!), а внутри имеем доступ и к внутреннему буферу, и к его размеру.
Красота!
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
14.09.2022, 18:27  [ТС]
KSergey9, функции и не нужно знать объем rawData. Она вызывает функции read, write и т.п. Выводить rawData в public - это грубейшее нарушение инкапсуляции на мой взгляд. Если уж нужно, буфер может выполнять return sizeof(rawData) в каком то методе. Сам объект же памяти не лишается от указателя :-)

Добавлено через 5 минут
KSergey9, во втором варианте вы просто передвинули проблему на уровень выше. На функцию тоже может быть указатель. Не переделывать же весь вышестоящий код под шаблоны? Плюс получится несколько экземпляра этой функции, расход памяти.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
14.09.2022, 19:16
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Выводить rawData в public - это грубейшее нарушение инкапсуляции на мой взгляд
Не хотите - не выводите. Мне для демопримера проще было так. Тем более, что начинку Func1() вы не показали.
Как вы сделаете в вашем коде - дело ваше.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
во втором варианте вы просто передвинули проблему на уровень выше.
Какую проблему??
Вы спросили: как синтаксически написать функцию, куда можно было бы аргументом передать Buff разного размера.
Я вам привел пример как это можно сделать.
Чем вы недовольны?

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
На функцию тоже может быть указатель.
Что это меняет? Ну и потом, вы на каждый ответ будете приводить новые придумки с хитрым прищуром? Неоригинально.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Не переделывать же весь вышестоящий код под шаблоны?
Это почему вдруг?
Вы захотели использовать другие языковые средства - пожалуйста. Как их использовать - вам показали в этой ветке.
Использовать или нет - дело ваше.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Плюс получится несколько экземпляра этой функции, расход памяти
Да, шаблон инстанцируется в несколько реализаций в зависимости от параметров. Так у вас и все методы внутри такого шаблона будут иметь несколько версий, ну т.е. фактически реализация такого класс-шаблона будет иметь столько реализаций, сколько вариаций значений в параметре шаблона в <> будет использовано. Это вас не смущает?

Нужна одна реализация функции - используйте подход 1, либо сделайте Func1() просто методом класса-шаблона, тогда проблема с передачей в неё разных вариаций Buff вовсе отпадёт.

Добавлено через 3 минуты
Если честно, моё мнение: делайте код на старых добрых макросах.
Ибо, моё мнение, все эти "шаблоны" - лапша на уши народу. А на самом деле абсолютно те же самые макросы, только в "стильном-молодёжном" синтаксисе.
Но это Тс-сс. Я такого не говорил, если что.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
14.09.2022, 19:44
Zhavoronkov5, ниже несколько вариантов, если вы так или иначе хотите, чтобы код на каком-то уровне оставался шаблонным.

Вариант #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Buff
{
public:
    virtual uint8_t * rawData() = 0;
 
    // ....
};
 
template <int size>
class BuffT : public Buff
{
    uint8_t m_rawData[size];
public:
    override uint8_t * rawData() { return m_rawData; }
};
Вариант #2 (на самом деле это более узкоспециализированное применение варианта 1)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Buff
{
    uint8_t *m_dataPtr{};
public:
    uint8_t * rawData() { return m_dataPtr; }
 
protected:
    void initPtr(uint8_t *p) { m_dataPtr = p; }
 
    // ....
};
 
template <int size>
class BuffT : public Buff
{
    uint8_t m_rawData[size];
public:
    BuffT() { Buff::initPtr(m_rawData); }
};
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
14.09.2022, 20:23
DrOffset, мне подсказывает чутье, что у автора func предполагается как некий внешний алгоритм для работы с Buff (через его же интерфейс/методы).
Поэтому мне кажется шаблонная реализация функции func, самым простым вариантом.
Еще один вариант, создать базовый интерфейс для Buff, достаточный для написания внешних алгоритмов.
Все прочие буферы будут наследоваться и поддерживать этот интерфейс.
В итоге такие алгоритмы как func, будут в одном экземпляре и принимать только указатель/ссылку на интерфейс.
Как в ваших вариантах, только без раздачи указателей.

Ну и кончено же назначение этой самой функции (func), определяет насколько необходимо изменять реализацию и конструкцию Buff.
А может все же лучше сделать ее методом того же буфера ...
Пока ёжик бродит в тумане, остается только гадать...
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
14.09.2022, 22:51  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Пока ёжик бродит в тумане, остается только гадать...
Я старался максимально выкинуть конкретику по задаче. Ну ОК, в моем проекте Buff - это то, что приходит в девайс с компьютера по интерфейсу USB, а Func должна выполнить расчет и отправить полученные данные по SPI в FPGA. Естественно, это не одна функция, а всего лишь стартовый метод большого класса. Она лишь сохранит указатель в приватную переменную этого класса и даст там команду "на старт".

Боюсь, ёжику от этого не полегчало :-)

Цитата Сообщение от SmallEvil Посмотреть сообщение
DrOffset, мне подсказывает чутье, что у автора func предполагается как некий внешний алгоритм для работы с Buff (через его же интерфейс/методы).
Абсолютно верно.
Цитата Сообщение от SmallEvil Посмотреть сообщение
Поэтому мне кажется шаблонная реализация функции func, самым простым вариантом.
И мимо. Шаблонная функция превратится компилятором в две, три - сколько будет буферов в проекте. Потом с этим указателем работать десятку других функций - их все делать шаблонными? Растрата памяти на ровном месте.

Впрочем, спасибо за фразу:
Цитата Сообщение от SmallEvil Посмотреть сообщение
Еще один вариант, создать базовый интерфейс для Buff, достаточный для написания внешних алгоритмов.
Я так понял, сделать нужно следующим образом?

C++
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
// Интерфейс.
class IBuff
{
public:
    virtual int GetRawDataSize(void)
    {
        return 1;
    }
};
 
 
 
// Базовый класс.
template <int size>
class Buff : public IBuff
{
    uint8_t rawData[size];
    
public:
    int GetRawDataSize(void)
    {
        return sizeof(rawData);
    }
 
};
 
 
 
 
 
 
// Функция-клиент.
void Func(IBuff* buff)
{
    printf("Func\r\n");
    printf("size = %d\r\n", buff->GetRawDataSize());
}
 
 
 
 
 
 
// Переменные
Buff<100> buff1;
Buff<1000> buff2;
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Func(&buff1);       // напечатает 100
    Func(&buff2);       // напечатает 1000
 
}
Так работает корректно. А в моем предыдущем коде ошибка. Указатель принимается, но методы вызываются из базового класса, а не из шаблонного класса-наследника.

Добавлено через 9 минут
Цитата Сообщение от KSergey9 Посмотреть сообщение
Если честно, моё мнение: делайте код на старых добрых макросах.
Вы пробовали отдебажить код на сложных макросах? Когда данные идут непонятно какие, с битыми пакетами (не JSON, но тоже весело). Подсказка: ставим брекпойнт, дебаггер сиротливо покажет на весь макрос сразу - и дальше дебажим в уме.

Возможность поставить брекпойнт внутри - да ради одного этого на С++ и шаблоны надо переходить.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
14.09.2022, 23:13
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
int GetRawDataSize(void)
    {
        return sizeof(rawData);
    }
Наверное стоит добавить constexpr, и множество вычислений повесить на этап компиляции.
Там где это возможно.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Так работает корректно.
Это если больше не будет дальше наследования. (потому как в Buff метод то не виртуальный)
Тогда и final на Buff стоит установить.
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
14.09.2022, 23:23
Цитата Сообщение от SmallEvil Посмотреть сообщение
Это если больше не будет дальше наследования. (потому как в Buff метод то не виртуальный)
В базовом классе метод объявлен как virtual, так что можно переопределять в любом наследнике
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
14.09.2022, 23:27
gray_fox, да, запутался, с этой виртуальностью нужно быть внимательным.
Но все же для большей читабельности и определенности, а также предупреждения ошибок :
стоит повторить (указать) virtual и override.
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
14.09.2022, 23:53  [ТС]
Повторное наследование работает, но коряво.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Наследник с удвоенным буфером
template <int size>
class DoubleBuff : public Buff<size>
{
    uint8_t rawData[size * 2];
 
public:
    int GetRawDataSize(void)
    {
        return sizeof(rawData);
    }
 
};
 
 
 
DoubleBuff<250> doubleBuff1;
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Func(&doubleBuff1); // напечатает 500.
В классе-наследнике2 придется продублировать метод класса-наследника1, хотя там ни буквы не поменялось. Иначе указатель вызывает метод наследника1.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.09.2022, 00:08
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
KSergey9, функции и не нужно знать объем rawData. Она вызывает функции read, write и т.п. Выводить rawData в public - это грубейшее нарушение инкапсуляции на мой взгляд.
Передавать шаблонный объект в шаблонную функцию это нормально. Знать размер, в данном случае - генерировать код (компилятору) в соответствии с требуемым типом. Если вы хотите работать в функции с объектом класса, то вы делаете её расширением интерфейса, этого класса. Вариант KSergey9, на мой взгляд - наиболее адекватен. Наследование в ембедед это не лучший вариант. Тут важно, нужна ли вам, действительно, динамическая типизация или все решаемо статически. Хорошая шаблонная функция хороша также и тем, что она может встраиваться. Что именно, вас смущает?
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
15.09.2022, 00:23  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Передавать шаблонный объект в шаблонную функцию это нормально.
Совсем ненормально. Я выше писал - этот указатель будет запомнен в другом классе, с ним будут работать десятки функций, некоторые будут ворочать тяжелые вычисления. Предлагаете все шаблонизировать - то есть, задублировать, затроить/и т.п.?

Цитата Сообщение от IGPIGP Посмотреть сообщение
Наследование в ембедед это не лучший вариант.
Нормальный вариант. Эмбед это уже давно не крохотные процессоры с 500 байтами памяти, где все можно только на ассемблере. Зачем ставить C++ и потом писать на макросах?

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

На самом деле если я сейчас забью и встрою в этот класс std::vector - мир не рухнет, код заработает. А если я не буду vector в процессе ресайзить - все проработает сто лет без сбоев. Память в куче один раз выделится при инициализации системы и все.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.09.2022, 00:46
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Совсем ненормально.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Передавать шаблонный объект в шаблонную функцию это нормально.
Zhavoronkov5, размер у вас параметр шаблона. В этом смысле он не инкапсулирован от слова "совсем". По этому нет нарушения инкапсуляции. Впрочем, дело ваше.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
15.09.2022, 08:35
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
На самом деле если я сейчас забью и встрою в этот класс std::vector
std::array же
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.09.2022, 08:35

Создать массив переменной длины вне функции
Здравствуйте снова. есть код: i,x,y,mapWidth=5,mapHeight=5,playerPosX = 1,playerPosY = 1; int map ; int main(){ for (i=0;i &lt;...

Двумерный динамический массив char переменной длины, realloc()
Доброго времени, коллеги! Пытаюсь по немногу изучать разные языки, попал такую позу: надо нагенерить для БД много рандомной информации,...

Нужен массив переменной длины с возможностью добавления элементов
нужен массив переменной длины, чтобы потом его примерно так заполнить: switch (XXX) { case 1: A = {0.6, 1, 2, 2.5, 4}; ...

Ошибка компиляции при работе с float переменной
Здравствуйте,изучаю java и не могу понять,почему при присвоении переменной(заранее объявленной типа float) компилятор выдает ошибку...

Объявление переменной вызывает ошибку 86 при компиляции
Здравствуйте. При компиляции выдаёт ошибку 86 о том, что нет двоеточия, на строку &quot;o:=0&quot; Соль в том, что двоеточие стоит....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка 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 реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru