Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3

Совместное создание игры

08.01.2025, 12:45. Показов 45153. Ответов 942
Метки нет (Все метки)

 Комментарий администратора 
Обсуждение вынесено из темы Ищу человека для совместного изучения программирования


Цитата Сообщение от Royal_X Посмотреть сообщение
Вот на моем неигровом ноуте последний UE без проблем запускается и не тормозит даже.
ок.
если ТС готов варганить со мной сапера, то я сделаю ещё одну попытку его(пожалуй 4 версию) установить и испытать.

собсно что нужно: формально отображать некие графические модели на экране в нужном его месте нужного масштаба,
для теста сойдут спрайты - а потом можно и анимированные модели голых девочек,
на усмотрение геймдиза))

и больше ничаво.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2025, 12:45
Ответы с готовыми решениями:

Для чего создан язык С++?
Для чего создан язык С++????

создан массив
создан массив автовладельцев, для каждого известны Ф.И.О., номер, адрес...,Выяснить есть ли автовладельцы у которых имеются больше 1-ой...

Теория игр, массивы
Есть задание (прикрепил его в виде файла к сообщению). Есть решение для 12-ого варианта на BORLANDC, у меня 2-ой. Я изменил в начале...

942
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6284 / 3008 / 1051
Регистрация: 01.06.2021
Сообщений: 11,269
24.02.2025, 23:47
gunslinger, сможешь нарисовать фрактал? Кто-нибудь знает, как рендерят такие красивые фракталы? (множество Мандельброта)
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
25.02.2025, 00:18
Я сам вряд ли (скорей всего; хотя особо и не пытался никогда, только что-то попроще). Но есть чужой код (фрактал Жулиа):
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    PaintBox1->Canvas->FillRect(PaintBox1->Canvas->ClipRect);
 
        struct Complex // Обьявляем структрура для хранения комплексных чисел
    {
        long double real; // Действительная часть
        long double image; // Мнимая часть
    };
 
    const int iteration = 500; // Обьявляем и инициализируем константу, которая хранит количество итераций
    const int max = 32; // Обьявляем и инициализируем константу, которая хранит максимальное значение,
    // Которое не должно превосходить сумма квадратов действительной и мнимой части комплексного числа
 
    Complex zComplex; // Обьявляем обьекты структуры Complex
    Complex tempComplex; // Которые будут хранить
    Complex cComplex; // Комплексные числа
 
    int valueX; // Координаты по Ох
    int valueY; // Координаты по Оу
    int counter; // Счетчик
 
    int lengthX; // Длина поля по Ох
    int lengthY; // Длина поля по Оу
 
    TColor color; // Цвета для закрашивания пикселей
    TColor secondColor; // Для RGB формата
    TColor thirdColor;
 
    lengthX = PaintBox1->Width / 2; // Считываем половину длины поля по Ох
    lengthY = PaintBox1->Height / 2; // Считываем половину длины поля по Оу
 
    for (valueY = -lengthY; valueY < lengthY; valueY++)
    {
        for (valueX = -lengthX; valueX < lengthX; valueX++)
        {
 
            counter = 0; // Обнуляем счетчик
            zComplex.real = valueX * 0.005; // Инициализируем действительную
            zComplex.image = valueY * 0.005; // И мнимую часть комплексного числа
            cComplex.real = -0.70176; // Инициализируем действительную и
            cComplex.image = -0.3842; // Мнимую часть комплексного числа
 
            // Считаем фрактал Жулиа пока сумма квадратов действительной и мнимой части
            // Комплексного числа меньше констанкты max и пока значение счетчика
            // counter меньше чем число итераций
            while (std::pow(zComplex.real, 2) + std::pow(zComplex.image, 2) < max && counter < iteration)
            {
                tempComplex = zComplex; // Копируем комплексное число во временную структуру
                // Считаем новые значения действительной части комплексного числа
                zComplex.real = std::pow(tempComplex.real, 2) - std::pow(tempComplex.image, 2) + cComplex.real;
                // Считаем новые значения мнимой части комплексного числа
                zComplex.image = 2 * tempComplex.real * tempComplex.image + cComplex.image;
                counter++; // Инкрементируем значение счетчика
            }
 
            // Если значение счетчика меньше, чем число итераций
            if (counter < iteration)
            {
                color = TColor(counter * 6 % 255); // Определяем первый цвет
                secondColor = TColor(counter * 9 % 255); // Определяем второй цвет
                thirdColor = TColor(counter * 11 % 255); // Определяем третий цвет
                // Заполняем пиксель сформируемым цветом
                PaintBox1->Canvas->Pixels[lengthX + valueX*(1+0*cos(M_PI/2))][lengthY + valueY*(1+0*sin(M_PI/2))] = TColor(RGB(color, secondColor, thirdColor));
                         }
        }
    }
}
//---------------------------------------------------------------------------


Делал только такое (либо чем-то "похожее" по принципу рисования вроде "спиральных квадратов" Компьютерная графика):
Фрактальные рисунки
Простой морфинг

Примеры кода (множество Мандельброта): https://ru.wikibooks.org/wiki/... ндельброта
Программа (Julia fractal generator): https://web.archive.org/web/20... -generator
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
25.02.2025, 09:17
Цитата Сообщение от Royal_X Посмотреть сообщение
но вот ни я, ни, наверное, Хулиган, не станем что-то писать на sfml, особенно старой версии.
Я на sfml смотрел только по диагонали. Знаю, что это просто объектная и расширенная надстройка над sdl (вроде бы как). Писать на win api, как я сейчас делаю, это всегда напряг, хотя и возможностей получаешь больше. По идее надо какую-то либу графическую юзать, чтобы в кайф было кодить, да и быстрее. Или движок какой..

Добавлено через 14 секунд
Вчера болел, ни чем не мог заниматься.
Цитата Сообщение от Royal_X Посмотреть сообщение
Короче, вся суть была в том, что если использовать ООП по максимуму, то потом, если захочется что-то менять или оптимизировать код, то весь код придется менять, потому что ООП работает по принципу домино.
Я тоже много статей читал по данной теме. Тема очень серьезная и обширная. По моему, в ООП есть своя сила и своя слабость. И не для всех случаев оно подходит. Тотальное ООП настолько же вредит, как и тотальная функциональщина.
Это - крайности. Нечто среднее нужно..
Сила ООП в том, что оно разгружает global пространство от львиной доли сущностей. Вместо сотен имен функций там всего лишь десятки имен объектов. И это хорошо. А дальше мы получаем вместо чистых функций грязные методы.. Грязная функция - функция, которая зависит от контекста. Сам же Страус об этом писал, критикуя обычный необъектный подход. Такая функция видит нечто вне себя и может это менять . И чтобы использовать её где-то еще, приходиться тащить и её окружение.. Это - плохо, - очень плохо.
А если у нас все функции распиханы по объектам, то они уже зависят от контекста своего объекта. Они видят нечто внутри объекта. Более того неявно получают указатель this на конкретный объект.. Тут приходится тащить с собой весь объект. Придумали дружественные классы и функции чтобы смягчить проблему, но это костыльное решение..
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
25.02.2025, 10:16
Немного не по теме, но скажу. Пришлось в геогебре код писать.
Синтаксис там весьма своеобразный. Параметры функций надо указывать явно (что логично, но не очевидно), но иногда они сами подставляются, иногда нет. Проверка синтаксиса может глючить - один и тот же код иногда ошибки выдает, иногда нет.
Бывает, что все подвисает. Короче, не пишите в геогебре (если есть выбор). В билдере все в разы проще (хотя так наверно и должно быть).

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
  // основной цикл
  for (n = 1; n <= n_max * coef; n++)
  {
    // значения радиуса и угла
    double tmp_r = r(c, n), tmp_t = t(n) + eps;
 
    // координаты точки
    x = x0 + tmp_r * cos(tmp_t);
    y = y0 - tmp_r * sin(tmp_t);
 
    // рисуем линии (magic numbers!!!)
    Canvas->Pen->Color = clGreen;
//  int val = r(c, n_max) / 2;
    const int k = 3;
    int u[k] = {n + 55, n + 89, n + 144};
    for (int i = 0; i < k; i++)
      if ((i < k - 1 && n >= 100 || i == k - 1) && u[i] <= n_max * coef)  // && abs(x - x0) <= val && abs(y - y0) <= val)
      {
        Canvas->MoveTo(x0 + r(c, u[i]) * cos(t(u[i]) + eps), y0 - r(c, u[i]) * sin(t(u[i]) + eps));
        Canvas->LineTo(x, y);
      }
 
    int d1 = SE_d1->Text.ToIntDef(D1), d2 = SE_d2->Text.ToIntDef(D2);
    double mult, tmp;  // множитель и радиус кружочков
    Canvas->Pen->Color = clBlack;
    if (n <= n_max)  // && abs(x - x0) <= val / coef && abs(y - y0) <= val / coef)
    {
      mult = tmp_r / r(c, n_max);
      mult *= (mult <= 2. / 3 ? 2. / 3 : 1);
      tmp = d1 - d2 * mult;
      Canvas->Ellipse(x - tmp, y - tmp, x + tmp, y + tmp);  // рисуем кружочки
      //Canvas->TextOutW(x, y, n);
    }
  }
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
25.02.2025, 10:35
Вот пример.
Что лучше:
1.
C++
1
2
3
int add1(int a, int b){
  return a + b;
}
или:
2.
C++
1
2
3
4
struct st{int a, b;};
int add2(struct st){
  return st.a + st.b;
}
Функция add2() привязана к своему типу st, и не может работать с другими. Первая функция может обслуживать любой тип с однотипными полями:
C++
1
с=fn1(st.a, st.b);//вместо st может быть другой тип
Добавлено через 12 минут
Один из законов Мерфи гласит:
"Создайте систему, которой сможет пользоваться даже дурак, и только дурак будет ей пользоваться".
Это к слову о том в каком направлении развивается мозг.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6284 / 3008 / 1051
Регистрация: 01.06.2021
Сообщений: 11,269
25.02.2025, 11:00
gunslinger, в браузере всё глючит. Я пользуюсь десктопной версией для винды: GeoGebra Classic 6. Нормально работает. Но у меня так же есть Maple, Wolfram Mathematica, Maxima.

Добавлено через 3 минуты
CoderHuligan, там ещё можно шаблон написать, лучше чем структура
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
25.02.2025, 11:09
Royal_X, сейчас вроде в браузере геогебра не зависает. Новые десктопные версии геогебры под вин 7 не работают.
Maple у меня был, но давно не пользовался.

Поменял параметры в коде из поста №842:
C++
54
55
56
57
58
59
60
61
62
63
64
            zComplex.real = valueX * 0.00005; // Инициализируем действительную
            zComplex.image = valueY * 0.00005; // И мнимую часть комплексного числа
// 1
            cComplex.real = -0.56267837374; // Инициализируем действительную и
            cComplex.image = 0.65679461735; // Мнимую часть комплексного числа
// 2
//          cComplex.real = -0.743643900055; // Инициализируем действительную и
//          cComplex.image = 0.131825890901; // Мнимую часть комплексного числа
// 3
//          cComplex.real = -0.70176; // Инициализируем действительную и
//          cComplex.image = -0.3842; // Мнимую часть комплексного числа
Результаты (1, 2, 3):


1
25.02.2025, 11:09

Не по теме:

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

0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
25.02.2025, 11:29
Короче, можно экспериментировать до бесконечности (такое мне понравилось):
C++
54
55
56
57
            zComplex.real = valueX * 0.00001; // Инициализируем действительную
            zComplex.image = valueY * 0.00001; // И мнимую часть комплексного числа
            cComplex.real = -0.56267837374; // Инициализируем действительную и
            cComplex.image = 0.65679461735; // Мнимую часть комплексного числа
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
25.02.2025, 11:44
Цитата Сообщение от Royal_X Посмотреть сообщение
там ещё можно шаблон написать
Можно. Но это как бы тупой дубляж в итоговом коде. Не красиво. Не будем раздражать XLAT, и продолжать тему.) Хотя в некоторых случаях шаблоны оправданны.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6284 / 3008 / 1051
Регистрация: 01.06.2021
Сообщений: 11,269
25.02.2025, 13:56
Цитата Сообщение от CoderHuligan Посмотреть сообщение
C++
1
2
3
4
struct st{int a, b;};
int add2(struct st){
  return st.a + st.b;
}
я только что заметил, что это даже нерабочий код. Нужно так писать:
C++
1
2
3
4
struct st { int a, b; };
int add2(st x) {
    return x.a + x.b;
}
А вообще, нужно передавать структуру по ссылке.
C++
1
2
3
4
struct st { int a, b; };
int add2(st& x) {
    return x.a + x.b;
}
Также, я бы сделал функцию членом структуры и переименовал название функции на более осмысленное.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
struct st 
{ 
    int a{}, b{};
    int getSum() { return a + b; }
};
 
int main()
{
    st s{ 3, 4 };
    std::cout << s.getSum() << std::endl;
}
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
25.02.2025, 15:18  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
C++
26
27
28
29
30
31
32
    ///--------------------------------------|
    /// Берём пиксели с пазла и укладываем.  |
    ///--------------------------------------:
    void init_4Sides()
    {
        /// TODO ...
    }
закрываем ТОДО:
["images.h"]
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
91
92
93
///-----------------------------------------------------------------------------
/// Прототип класса для задачи.
///------------------------------------------------------------------ TaskImage:
struct  TaskImage : myImage
{
 
...
 
private:
    ///--------------------------------------|
    /// 4 дампа с пикселями.                 |
    ///--------------------------------------:
    std::array<Mat2dPixel, 4>         _4Sides;
 
    inline static unsigned width{2};
 
    ///--------------------------------------|
    /// Берём пиксели с пазла и укладываем.  |
    ///--------------------------------------:
    static void init_4Sides(std::array<Mat2dPixel, 4>& _4S,
                            const sf::Image&           img)
    {
        const sf::Vector2u SZ = img.getSize();
 
        ///---------------|
        /// eSIDES::UP    |
        ///---------------:
        {
            Mat2dPixel& mat = _4S[eSIDES::UP];
 
            for    (unsigned y = 0; y < width; ++y)
            {
                mat.emplace_back(std::vector<sf::Color>());
                mat.back().reserve(SZ.x);
 
                for(unsigned x = 0; x < SZ.x ; ++x)
                {   mat.back().emplace_back(img.getPixel(x, y));
                }
            }
        }
 
        ///---------------|
        /// eSIDES::RIGHT |
        ///---------------:
        {
            Mat2dPixel& mat = _4S[eSIDES::RIGHT];
 
            for(unsigned x = SZ.x - 1, i = 0; i < width; --x, ++i)
            {
                mat.emplace_back(std::vector<sf::Color>());
                mat.back().reserve(SZ.y);
 
                for(unsigned y = 0; y < SZ.y ; ++y)
                {   mat.back().emplace_back(img.getPixel(x, y));
                }
            }
        }
 
        ///---------------|
        /// eSIDES::DOWN  |
        ///---------------:
        {
            Mat2dPixel& mat = _4S[eSIDES::DOWN];
 
            for(unsigned y = SZ.y - 1, i = 0; i < width; --y, ++i)
            {
                mat.emplace_back(std::vector<sf::Color>());
                mat.back().reserve(SZ.x);
 
                for(unsigned x = 0; x < SZ.x ; ++x)
                {   mat.back().emplace_back(img.getPixel(x, y));
                }
            }
        }
 
        ///---------------|
        /// eSIDES::LEFT  |
        ///---------------:
        {
            Mat2dPixel& mat = _4S[eSIDES::LEFT];
 
            for(unsigned x = 0; x < width; ++x)
            {
                mat.emplace_back(std::vector<sf::Color>());
                mat.back().reserve(SZ.y);
 
                for(unsigned y = 0; y < SZ.y ; ++y)
                {   mat.back().emplace_back(img.getPixel(x, y));
                }
            }
        }
    }
...
тестируем:
["images.h"]
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
...
 
    static void test_4Sides()
    {   std::cout << "Start::test_4Sides():\n";
 
        sf::Image img;
                  img.create(5, 8);
 
        ln(img.getSize())
 
        ///--------------------------------------|
        /// Заполняем красный в img змейкой.     |
        ///--------------------------------------:
        {
            unsigned char red = 0;
            for(unsigned  x = 0; x < img.getSize().x; ++x)
            {   img.setPixel(x, 0, {red++, 0, 0});
            }
 
            for(unsigned  y = 1; y < img.getSize().y; ++y)
            {   img.setPixel(img.getSize().x - 1, y, {red++, 0, 0});
            }
 
            for(unsigned  x = img.getSize().x - 2; x < img.getSize().x; --x)
            {   img.setPixel(x, img.getSize().y - 1, {red++, 0, 0});
            }
 
            for(unsigned  y = img.getSize().y - 2; y != 0; --y)
            {   img.setPixel( 0, y, {red++, 0, 0});
            }
        }
 
        ///--------------------------------------|
        /// Буфер для пикселей:                  |
        /// 4 матрицы толщиной width.            |
        ///--------------------------------------:
        std::array<Mat2dPixel, 4> _4STest;
 
        ///--------------------------------------|
        /// Кролик тестирования.                 |
        ///--------------------------------------:
        init_4Sides             ( _4STest, img );
 
        unsigned E{eSIDES::UP };
 
        ///--------------------------------------|
        /// Ручная, т.е. глазная верификация.    |
        ///--------------------------------------:
        /// Содержимое img.                      |
        ///--------------------------------------:
        for    (unsigned y = 0; y < img.getSize().y; ++y)
        {       std::cout << "  ";
            for(unsigned x = 0; x < img.getSize().x; ++x)
            {   std::cout << std::setw(3) << (int)img.getPixel(x, y).r;
            }   std::cout << '\n';
        }       std::cout << '\n';
 
        l(width)
 
        ///--------------------------------------|
        /// Содержимое буферов по сторонам img.  |
        ///--------------------------------------:
        for        (const auto& mat   : _4STest)
        {   std::cout << whatSIDE(eSIDES(E++)) << ":\n";
            for    (const auto& line  : mat    )
            {       std::cout << "  ";
                for(const auto& pixel : line   )
                {   std::cout << std::setw(3) << (int)pixel.r;
                }   std::cout << '\n';
            }       std::cout << '\n';
        }           std::cout << '\n';
 
        std::cout << "Finished::test_4Sides():\n";
    }
запускаем:
["main.cpp"]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
 
void tests()
{
/// myl::testfoo_getVSizeWH();
/// CastomFilesCargo ::test();
/// HeroTest         ::test();
/// TaskImage        ::test();
    TaskImage ::test_4Sides();
/// LoaderImages     ::test();
/// DrawImage        ::test();
 
/// std::unique_ptr<Run> run(new Run);
}
рез:
Code
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
LOGOVERSION: Test-demo::0.0.2
START ...
 
Start::test_4Sides():
img.getSize():
    WH: [5, 8]
 
    0  1  2  3  4
   21  0  0  0  5
   20  0  0  0  6
   19  0  0  0  7
   18  0  0  0  8
   17  0  0  0  9
   16  0  0  0 10
   15 14 13 12 11
 
width: 2
UP:
    0  1  2  3  4
   21  0  0  0  5
 
DOWN:
   15 14 13 12 11
   16  0  0  0 10
 
RIGHT:
    4  5  6  7  8  9 10 11
    3  0  0  0  0  0  0 12
 
LEFT:
    0 21 20 19 18 17 16 15
    1  0  0  0  0  0  0 14
 
 
Finished::test_4Sides():
 
FINISHED PROGRAMM!
надеюсь, из теста ясно что там происходит...

теперь у нас есть унифицированные буферы 4 сторон фрагмента пазла...
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6284 / 3008 / 1051
Регистрация: 01.06.2021
Сообщений: 11,269
25.02.2025, 15:28
Цитата Сообщение от XLAT Посмотреть сообщение
надеюсь, из теста ясно что там происходит...
как понимаю, ты собираешься сравнивать не одну линию граничных пикселей, а несколько линий, поэтому ты создал функции для взятия граничных пикселей с произвольной шириной
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
25.02.2025, 17:26
Цитата Сообщение от Royal_X Посмотреть сообщение
CoderHuligan, там ещё можно шаблон написать, лучше чем структура
А ещё можно написать на void* - лучше чем любые шаблоны.

Добавлено через 7 минут
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вот пример.
Говнокодить можно в любой парадигме и ЯП.
РоялХ это хорошо доказал на примере goto, а ты с другой стороны.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6284 / 3008 / 1051
Регистрация: 01.06.2021
Сообщений: 11,269
25.02.2025, 17:47
Цитата Сообщение от SmallEvil Посмотреть сообщение
доказал на примере goto
можешь и continue не использовать, ты же эксперт, не то, что я
а через год можешь и break не использовать
и так, по мере развития, отказывайся постепенно от фич языка

И, кстати, я показал выше один из немногих примеров, где использование goto оправдано, а использование других методов является говнокодом. Но если не понял, ну что ж поделать, бывает. Пиши, как хочешь.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
25.02.2025, 18:21
Цитата Сообщение от SmallEvil Посмотреть сообщение
Говнокодить можно в любой парадигме и ЯП.
Естественно можно.
Цитата Сообщение от SmallEvil Посмотреть сообщение
на примере goto, а ты с другой стороны.
Можно и goto использовать не по назначению. А можно и ООП сделать хуже чем неумеренное применение goto.
Почему корпорации потихоньку переходят на свои языки? Сложно поддерживать существующую кодовую базу. Чем больше фич в языке, тем сложнее за ними всеми уследить. В голове надо удерживать всю иерархию наследования и пр. и т.п. Это современный goto, современная лапша.
Я вот сейчас код отлаживал и по невнимательности пропустил после объявления функции точку с запятой. Плюсовый компилятор мне вывалил простыню ошибок, причем в стандартной библиотеке. Я целый час убил, чтобы понять что произошло,пока сам не увидел этот пропуск. Сишный компиль бы сразу бы указал, что пропущена точка с запятой, и дело в шляпе. А я трахался целый час))

[siz
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6284 / 3008 / 1051
Регистрация: 01.06.2021
Сообщений: 11,269
25.02.2025, 19:10
Цитата Сообщение от CoderHuligan Посмотреть сообщение
вот сейчас код отлаживал и по невнимательности пропустил после объявления функции точку с запятой. Плюсовый компилятор мне вывалил простыню ошибок, причем в стандартной библиотеке. Я целый час убил, чтобы понять что произошло,пока сам не увидел этот пропуск. Сишный компиль бы сразу бы указал, что пропущена точка с запятой, и дело в шляпе. А я трахался целый час))
Вообще-то, нормальная ide, а если быть точнее, её статический анализ - линтер - должен еще до компиляции сообщить о таких тупых вещах.

Например, как видно на скриншоте, линтер предупреждает, что нужно поставить точку с запятой. Более того, предлагает фикс - нужно нажать всего лишь на лампочку и он сам поставит эту точку с запятой.

0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
25.02.2025, 19:42
Цитата Сообщение от Royal_X Посмотреть сообщение
нормальная ide
Я в code blocks сейчас работаю. Может VS и подсказала бы, не знаю. Объявление было в самом конце h файла, и компиль ничего внятного кроме простыни невнятных ошибок не сообщил.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6284 / 3008 / 1051
Регистрация: 01.06.2021
Сообщений: 11,269
25.02.2025, 20:45
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Я в code blocks сейчас работаю
в C::B дефолтно нет статического анализа кода. Даже подсказки при вводе кода работают ненормально.
Например, если написать
C++
1
std::string s = "hello";
и вот если будешь писать s = s. и как поставишь точку, появятся подсказки. Однако, если изначально написать
C++
1
std::string s{"hello"};
то при написании s = s. никакие подсказки не появятся.

Можно улучшить редактор если отключить старинный CodeCompletion плагин и вместо него использовать плагин clangd-client. Но для этого нужно установить еще mingw-w64-ucrt-x86_64-clang-tools-extra, например, если используешь mingw-w64-ucrt-x86_64-gcc, потому что в настройках плагина нужно выбрать путь к usr\bin\cland.exe
1
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
25.02.2025, 20:50
Цитата Сообщение от Royal_X Посмотреть сообщение
А вообще, нужно передавать структуру по ссылке.
В данном случае не нужно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.02.2025, 20:50

Решение матричных игр. Есть у кого такая программа написанная уже...
Требуется программа по решению матричных игр... С выбором размера матрицы и выдачей решения... Может кто смогёт такую сбатцать?

Запуск приложений(старых игр) в оконном режиме
День добрый, подскажите, хотелось бы реализовать свое желание запуска старых игр windo`вых(типа StarCraft) в оконном режиме, с чего начать,...

Алгоритм календаря игр (например в футболе)
необходимо составить календарь футбольных матчей, допустим есть 6 команд char *teams = {&quot;TEAM A&quot;,&quot;TEAM B&quot;,&quot;TEAM...

Движок для игр
Всем привет!!!, хотел узнать возможно ли создать движок на C++ чтобы экспортировать модели из 3ds max а после в самом движке можно было...

Выбор IDE для создания 2D игр
Здравствуйте. Задача сделать пака 2ух – мерные драчки загружая в проект анимацию-как удар(ы) и реакция на удар...(лучше всего секвенцию...


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

Или воспользуйтесь поиском по форуму:
860
Закрытая тема Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru