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

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

10.06.2022, 17:48. Показов 3910. Ответов 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
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
15.09.2022, 08:49  [ТС]
Студворк — интернет-сервис помощи студентам
Сделан вот такой вариант:
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
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
// Базовый класс.
class Buff
{
protected:
    uint8_t* rawData;
    int rawDataSize;
 
    // Методы
public:
    int GetRawDataSize(void)
    {
        return rawDataSize;
    }
    
    // Тут дальше будет много методов.
 
};
 
 
 
// Шаблонный класс-наследник.
template <int size>
class BuffT : public Buff
{
    uint8_t rawDataArray[size];
    
    // Конструктор
public:
    BuffT()
    {
        rawData = rawDataArray;
        rawDataSize = sizeof(rawDataArray);
    }
    
 
};
 
 
// Шаблонный класс-наследник с удвоенным буфером.
template <int size>
class DoubleBuffT : public BuffT<size>
{
    uint8_t rawDataArray[size * 2];
 
    // Конструктор
public:
    DoubleBuffT()
    {
        rawData = rawDataArray;
        rawDataSize = sizeof(rawDataArray);
    }
};
 
 
 
 
 
 
 
 
 
 
// Функция-клиент.
void Func(Buff* buff)
{
    printf("Func\r\n");
    printf("size = %d\r\n", buff->GetRawDataSize());
}
 
 
 
 
 
 
// Переменные
BuffT<100> buff1;
BuffT<1000> buff2;
DoubleBuffT<250> doubleBuff1;
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Func(&buff1);       // напечатает 100
    Func(&buff2);       // напечатает 1000
    Func(&doubleBuff1); // напечатает 500.
 
    return 0;
}
Все методы описываются один раз, в базовом классе, не надо их копипастить в интерфейсный класс. Корректно работает наследование. Функция-клиент не шаблонная.

Добавлено через 8 минут
Теперь бы запретить создание объектов класса Buff, и будет счастье. А то ведь сам через полгода забуду и создам :-)
0
фрилансер
 Аватар для Алексей1153
6506 / 5755 / 1134
Регистрация: 11.10.2019
Сообщений: 15,403
15.09.2022, 08:56
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
// Базовый класс.
class Buff
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
template <int size>
class BuffT : public Buff
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
// Шаблонный класс-наследник с удвоенным буфером.

всё это заменяем на один вот такой класс
C++
1
2
3
4
5
6
7
8
template <size_t size>
class Buff
{
    std::array<uint8_t,size> rawData{};
    size_t actual_size{};
public:
....
};
в методах просто учитываем actual_size, а не только rawData.size()
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
15.09.2022, 09:21
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Теперь бы запретить создание объектов класса Buff, и будет счастье.
Ответ гуглится быстро.

Добавлено:
Фига себе!!
А почему нельзя ссылку на ru stackoverflow com вставлять?? капец

Добавлено через 2 минуты
гуглить по фразе "Запрет создания базового класса"
Кратко: прописать все конструкторы базового класса в protected:
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.09.2022, 12:15
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Сделан вот такой вариант:
Ну вам это выше и предлагали.

Добавлено через 4 минуты
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// Шаблонный класс-наследник с удвоенным буфером.
template <int size>
class DoubleBuffT : public BuffT<size>
{
 uint8_t rawDataArray[size * 2];
// Конструктор
public:
 DoubleBuffT()
 {
   rawData = rawDataArray;
   rawDataSize = sizeof(rawDataArray);
 }
};
Вы же вроде не хотели просто так код дублировать, а тут сами его дублируете (ваш объект двойного буфера будет больше, чем мог бы быть)?
Почему не так?
C++
1
2
3
4
5
6
template <int size>
class DoubleBuffT : public BuffT<size * 2>
{
public:
 DoubleBuffT() = default;
};
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.09.2022, 12:16
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
На самом деле если я сейчас забью и встрою в этот класс std::vector - мир не рухнет, код заработает.
На самом деле, основным приёмом работы с динамическим полиморфизмом, является создание объектов - наследников в свободной памяти, а не на стеке. Вектор не станет чем-то более страшным.
Что кассается std::array<> то он получше си-шного, но размер - параметр времени компиляции, то есть, в принципе то же добро, что мы тут уже имеем. Подумайте о том, какой инвариант вы защищаете своим мнимым инкапсулированием. Какие методы вы хотите передать классу, защищая от записи данный массив. И какая может быть защита, если объявленный интерфейс возвращает указатель на память массива.
Вы поставили задачу в стиле шаблонного класса. Решение строится от задачи.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.09.2022, 12:17
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Теперь бы запретить создание объектов класса Buff, и будет счастье. А то ведь сам через полгода забуду и создам :-)
Предложенный выше по теме вариант с абстрактным Buff как раз призван решить эту проблему.

Не понятно, почему вы совсем проигнорировали тот пост.
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
15.09.2022, 14:40  [ТС]
DrOffset, мы, по-моему, так и не поняли друг друга. Вот Ваш код.
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; }
};
Мне важно создать указатель на шаблонный класс, и передать его в нешаблонную функцию. В вашем коде ни функции, ни указателя на класс Buff просто не было. Вместо этого в классе BuffT Вы выдаете наружу указатель на rawData - зачем? Эти данные должны быть надежно защищены от воздействия извне.

Добавлено через 6 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Подумайте о том, какой инвариант вы защищаете своим мнимым инкапсулированием.
Я не знаю, что вы понимаете под инкапсулированием.

Яндекс дает такое определение: "Упаковка данных и функций в один компонент (например, класс) и последующий контроль доступа к этому компоненту, создавая тем самым "чёрный ящик" из объекта"

В данном случае я создал сложный буфер, на шаблонах, с методами и т.п. Но для функции Func этот объект - черный ящик. Она ничего не знает про то, что он шаблонный. Она получает указатель на объект, и дергает его за публичные методы Read, Write, GetRawDataSize и т.п. Все логично, четко и понятно.

Если завтра я решу убрать из класса Buff шаблон и сделаю его на основе vector - менять Func не придется вообще.

В этом, по-моему, и смысл инкапсуляции в ООП?

Добавлено через 39 секунд
KSergey9, спасибо, работает.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.09.2022, 14:59
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
В вашем коде ни функции, ни указателя на класс Buff просто не было.
Ну так я показываю не код, а концепцию разделения шаблонного от нешаблонного.
Поэтому я не пишу никаких функций, а только то (на примере), что относится к концепции.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
. Вместо этого в классе BuffT Вы выдаете наружу указатель на rawData - зачем?
Выдача указателя - это пример. Я и никто здесь точно не знает как именно вы собрались использовать этот класс, нужно или не нужно "выдавать указатель", но вы спросили конкретно как разделить шаблонную часть от нешаблонной при передаче куда-либо и я показал вам это. Какие именно методы будут в нешаблонной части - это решать вам, не мне, поэтому я и не даю этого.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.09.2022, 15:06
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Если завтра я решу убрать из класса Buff шаблон и сделаю его на основе vector - менять Func не придется вообще.
В этом, по-моему, и смысл инкапсуляции в ООП?
Это не про инкапсуляцию.
Это про обобщение, АТД и разделение данных от алгоритмов.

.

Добавлено через 6 минут
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
DrOffset, мы, по-моему, так и не поняли друг друга.
Вы недавно на С++ пишите ?

Абстрактный класс - класс хотя бы с одним чисто виртуальным методом.
Пример
C++
1
2
3
4
class Buff{
public:
    virtual uint8_t * rawData() = 0;
};
Кроме того, я такие классы называю интерфейсами (или более отдельным термином "чисто абстрактный класс"), которые абстрактные и не имеют полей.

Так вот, объект абстрактного класса "невозможно" создать. Это запрещено в С++, так как не все его методы определенны.
Но можно создать указатель на такой класс. И использовать с его помощью полиморфизм.
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
15.09.2022, 15:19  [ТС]
SmallEvil, я же выше сделал на интерфейсе IBuff и Buff. Не понравилось. Методы интерфейса приходится дублировать в каждом наследнике. Иначе из кода все вызывается корректно, а указатель вызывает методы класса-родителя.

Теперь же я просто ввел в код промежуточный указатель. Каждый потомок обновляет его в своем конструкторе. У потомков вообще нет никаких методов, они все их наследуют из базового класса. Возможно, это каким-то термином называется, я не могу сказать. Пока работает, визуально просто.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
15.09.2022, 15:27
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
а указатель вызывает методы класса-родителя.
Только что хотел это написать.
Ну так не зря ж в приведенном примере в базовом классе виртуальный метод был. И как-то это в условиях "экономности" мне не нравится. Хотя наверняка не так уж и дорого.
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
15.09.2022, 15:31  [ТС]
KSergey9, посмотрите посты в этой ветке. В интерфейсе IBuff метод виртуальный. Наследуем от него класс Buff. Указатель вызывает метод класса Buff. Наследуем DoubleBuff : Buff. Указатель на DoubleBuff вызывает метод Buff. Приходится в DoubleBuff переопределять метод, хотя в нем ничего не меняется. Плохо, мне не понравилось.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.09.2022, 15:39
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Теперь же я просто ввел в код промежуточный указатель. Каждый потомок обновляет его в своем конструкторе. У потомков вообще нет никаких методов, они все их наследуют из базового класса.
Именно это было показано в посте #30 во втором примере.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Методы интерфейса приходится дублировать в каждом наследнике.
Вообще про то, что потомков будет несколько, в теме не было сказано ни слова.
Это все еще можно решить оставаясь в рамках концепции выделения виртуального интерфейса для шаблона, но предупреждать о таком надо заранее, т.к. решение чуть поменяется.

Добавлено через 2 минуты
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
В классе-наследнике2 придется продублировать метод класса-наследника1, хотя там ни буквы не поменялось. Иначе указатель вызывает метод наследника1.
Ну это, вообще говоря, происходит в данном случае от неправильного применения наследования. Вы зачем-то сделали еще один буфер в наследнике, хотя именно в вашем случае этого делать не нужно. Я показал как нужно в посте #44.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.09.2022, 15:44
Цитата Сообщение от KSergey9 Посмотреть сообщение
Хотя наверняка не так уж и дорого.
Посчитай, сколько рабочих дней будет убито на всякое извращение и его отладку.
При том же приеме с не шаблонном базовым классом, это уже проверенная классика.
На счет ресурсов, при полиморфизме берется в расчет только время выполнение, необходимое на поддержку механизма.
Другие варианты еще хуже, менее гибкие.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
С++ только начал изучать, до этого много работал на C. Там такое невозможно, только так:
К тому же к такому кодерству всегда можно вернуться, лишь упаковав все в пространства имен и структуры.
Но опять же поддержка такого кода будет сложнее.
Вывод сам напрашивается...
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
15.09.2022, 15:56
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
KSergey9, посмотрите посты в этой ветке. В интерфейсе IBuff метод виртуальный
При чем здесь IBuff, если в последнем вашем примере, про который вы написали в #41
Сделан вот такой вариант:
никакого IBuff и виртуального метода нет? А ведь по вашему же комментарию логично предположить, что это вариант у вас финальный.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
В интерфейсе IBuff метод виртуальный. Наследуем от него класс Buff. Указатель вызывает метод класса Buff. Наследуем DoubleBuff : Buff. Указатель на DoubleBuff вызывает метод Buff.
Т.е. вы хотите сказать, что при наследовании

DoubleBuff : Buff : IBuff

у виртуального метода, объявленного в IBuff, пропадает виртуальность?!
Покажите такой код. Тогда будет предмет.
Иначе вы долго будете недоумевать над моими словами, а я - над вашими.
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
15.09.2022, 16:01  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Именно это было показано в посте #30 во втором примере.
Во втором примере какое-то хитрое колдунство. Я избегаю хитрого кода, даже если он вроде работает. Зачем вызывать не статическую функцию из другого класса не через объект, а напрямую?
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще про то, что потомков будет несколько, в теме не было сказано ни слова.
Это все еще можно решить оставаясь в рамках концепции выделения виртуального интерфейса для шаблона, но предупреждать о таком надо заранее, т.к. решение чуть поменяется.
Ха. Я недавно в С++, но в профессии давно. Рад, если вам сразу выдают полное ТЗ и архитектуру системы, сам я ни разу такого не видел. Фраза: "ну тут надо немного поменять..." за два дня перед дедлайном знакома.
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну это, вообще говоря, происходит в данном случае от неправильного применения наследования. Вы зачем-то сделали еще один буфер в наследнике, хотя именно в вашем случае этого делать не нужно. Я показал как нужно в посте #44.
В посте #44 остроумное решение, но для частного случая. Если буфер захотят увеличить в полтора раза - будете на float умножать?

Добавлено через 3 минуты
KSergey9, вариант на интерфейсном классе и наследовании описывался в постах #30-#36.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.09.2022, 16:30
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Ха. Я недавно в С++, но в профессии давно.
Вам на форуме помогают бесплатно. А за деньги можно и потерпеть неполные ТЗ, и т.д. В любом случае это все оффтоп, я лишь говорю о том, что решение, которое вы получите здесь, будет меняться, если будут изменения в требованиях, поэтому сразу отвергать какие-то варианты неразумно и вредно. Если вы в профессии давно, то должны это понять.
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Плохо, мне не понравилось.
_______________________
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Во втором примере какое-то хитрое колдунство.
Обычный код. Вы часто будете такое видеть в будущем, особенно в коде с шаблонами. Однако вы не увидели леса за деревьями.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Зачем вызывать не статическую функцию из другого класса не через объект, а напрямую?
Нестатическую функцию нельзя вызвать "не через объект". Вызов всегда будет через объект. В данном случае вы просто наблюдаете квалифицированное имя при вызове.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Если буфер захотят увеличить в полтора раза - будете на float умножать?
Во-первых это ваш пример, не мой. Вы там умножаете на 2, я у себя тоже умножаю на 2.
Во-вторых, у вас конкретная проблема была именно в этом примере и именно по причине, которую я озвучил.
В-третьих, если потребуется, почему бы и не умножить на float (с учетом, естественно, что размер массива задается целым числом)?

Добавлено через 11 минут
Цитата Сообщение от KSergey9 Посмотреть сообщение
Т.е. вы хотите сказать, что при наследовании
DoubleBuff : Buff : IBuff
у виртуального метода, объявленного в IBuff, пропадает виртуальность?!
Виртуальность не пропадает. Он просто сделал еще один буфер в наследнике DoubleBuffT, который естественно не видят функции, которые определяются в шаблонном BuffT - они-то работают со своим буфером. Поэтому да, ему приходится "перенацеливать" в DoubleBuffT функции на новый буфер, чтобы ничего не сломалось.
Однако на самом деле именно в данном случае второй буфер в наследнике DoubleBuffT не нужен. Можно спокойно использовать буфер из BuffT - он же шаблонный. И тогда получится, что функции прекрасно используются уже унаследованные, и ничего дополнительно переопределять не надо.
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
15.09.2022, 16:41  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Виртуальность не пропадает. Он просто сделал еще один буфер в наследнике DoubleBuffT, который естественно не видят функции, которые определяются в шаблонном BuffT - они-то работают со своим буфером. Поэтому да, ему приходится "перенацеливать" в DoubleBuffT функции на новый буфер, чтобы ничего не сломалось.
Однако на самом деле именно в данном случае второй буфер в наследнике DoubleBuffT не нужен. Можно спокойно использовать буфер из BuffT - он же шаблонный. И тогда получится, что функции прекрасно используются уже унаследованные, и ничего дополнительно переопределять не надо.
Хорошо. В посте #44 Вы сделали изящное решение. Но сильно не универсальное. Как сами пишете "именно в данном случае".

Завтра тимлид скажет, что в DoubleBuffer должен быть не один удвоенный буфер, а два одинарных. Плюс нужна функция, которая их переключает. И Ваше изящное решение летит в корзину. И Вам придется сделать еще еще один буфер в наследнике DoubleBuffT. И указатель их не увидит. И вам придется "перенацеливать" функции. Делать все то, о чем с сарказмом пишете.

Рад, если Вы работаете с опытным архитектором, который сразу выдает вам каркас, и вы просто нанизываете на него свой код. У меня такого нет. Изящное, но узкоспециализированное решение - хуже, чем обычное, но универсальное.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.09.2022, 16:48
Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
Но сильно не универсальное.
Универсальных решений нет.
Все решения делаются под задачу. Т.к. никаких других задач тут озвучено не было, сделано было именно так, да и если бы они были, я, напомню, здесь совершенно бесплатно, поэтому какую именно часть делать, более универсальна она будет или менее - решаю я сам. Так что здесь вы просто можете сказать мне спасибо, что я показал вам на корень проблемы в вашем примере. Обсуждать что-то за этими рамками не вижу смысла, т.к. мы даже с вами не коллеги.

Цитата Сообщение от Zhavoronkov5 Посмотреть сообщение
И Ваше изящное решение летит в корзину. И Вам придется сделать еще еще один буфер в наследнике DoubleBuffT. И указатель их не увидит.
Это как раз нормально. Мы меняем поведение, значит должны это обозначить через переопределение функции.
В вашем примере поведение не менялось, а менялся лишь размер.
Это разные ситуации.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.09.2022, 00:16
А я все ж свои о,1 копеек вставлю, ничего ему такого не нужно, пусь пишет аналог си пдобнызх методов программирования на с++ языке, ибо ему не поддастся это, это, обобщонное программирование.!

Добавлено через 31 минуту
DrOffset, не знаю поможет ли это,
но у автора есть опыт лишь в процедурном программироавании

Добавлено через 3 часа 55 минут
Zhavoronkov5, зотите прикол ?
С++ придуман не для экономии ресурсов . Хы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.09.2022, 00:16

Создать массив переменной длины вне функции
Здравствуйте снова. есть код: 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; Соль в том, что двоеточие стоит....


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru