Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/82: Рейтинг темы: голосов - 82, средняя оценка - 4.96
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041

Двойная диспетчеризация :)

31.03.2013, 04:27. Показов 16033. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здорова!
Я тут от пытаюсь понять такое понятие взаимодействия классов или хз как назвать, вообщем что такое двойная диспетчеризация. Так сказать. 4 статьи как бы так бегло прочитал но никак нимогу врубиться, что это такое.
Кто может простыми словами объяснить, что это такое?

Добавлено через 49 секунд
Щас голова тяжолая фиг шо варит

Добавлено через 1 минуту
И еще хочу попытаться смоделировать на примере простых классов.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2013, 04:27
Ответы с готовыми решениями:

Виртуальный конструктор(мульти диспетчеризация)
Доброго времени суток. Гуру плюсов, помогите с пояснением смысла вирт. конструктора. Бродя в сети нашел несколько вариаций...

Двойная сумма на C++
Есть такое вот задание: \sum_{i=1}^{n-1} \sum_{j=1}^{n-1} x/(i+j) (В условии есть и произведение, но его скидывать не стал, так как...

двойная табуляция
Здравствуйте. Помогите написать функцию. Есть таблица в ней, заполненные столбцы и пустые. Программа записывает в пустые столбцы значения...

45
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
31.03.2013, 10:22
до кучи найдите книгу и прочитайте следующее:
Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов
Автор: Скотт Мейерс
Правило 31. Создавайте функции, виртуальные по отношению более чем к одному объектуhttp://rsdn.ru/res/book/cpp/most_effective_cpp.xml

Сперва одинарная если ее так можно назвать:
Классический пример. Имеем базовый класс Shape и производные от него. У Shape есть виртуальным метод Draw.
В наследниках он как-то имплементится. Имея указатель на Shape вызываем Draw и за счет механизма работы виртуальных функций вызовится правильный метод отрисовки. Т.е. в этом случае не зная на какой именно объект указывает указатель, вызывается правильный метод.

В двойное диспетчеризации нужно тоже самое, только для двух объектов. Т.е. имея два указателя на базовый классы и не зная, на какие именно объекты они ссылаются, нужно вызвать правильную функцию, которая обработала бы вызов в зависимости от конкретных типов этих двух объектов. В книге описывается столкновение
двух объектов. В зависимости от типов объектов столкновения должны по разному обрабатываться.
Т.е клиентский код выглядит как-то так:
Object* obj1 = ...
Object* obj2 = ...
Process(obj1, obj2);

Если объекты - астероиды - то это один способ обработки.
Если объекты - астероид и космический корабль - другой способ.
И т.д.

Вот задача двойной диспетчеризации - это задача нахождения правильной функции обработки столкновения объектов.
3
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
31.03.2013, 13:00
Есть хороший пример на графических примитивов в каком-нибудь векторном графическом редакторе. Допустим, есть общий предок Shape, от которого наследуются Circle, Square и Triangle (круг, квадрат, треугольник). Нам надо уметь определить площадь пересечения двух фигур. Очевидно, математика такого пересечения зависит от того, какие именно фигуры пересекаются. Но вот сам рисунок представлен в виде коллекции указателей на Shape, где мы можем выбрать произвольно два объекта и поинтересоваться площадью их пересечения. Вот тут-то и вступает в дело двойная диспетчеризация:
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
class Circle;
class Triangle;
class Square;
 
class Shape {
public:
    virtual double getIntersection(const Shape& other) const = 0;  // Функция, которая вызывается для определения площади пересечения
    // Эти функции вычисляют площадь пересечения с конкретной фигурой
    // Для ясности к именам добавлена буква, идентифицирующая класс,
    // но на самом деле необходимости в ней нет, компилятор сориентируется по типам ссылок
    virtual double getIntersectionC(const Circle& c) const = 0;
    virtual double getIntersectionT(const Triangle& t) const = 0;
    virtual double getIntersectionS(const Square& s) const = 0;
};
 
class Circle: public Shape {
public:
    virtual double getIntersection(const Shape& other) const
    {
        return other->getIntersectionС(*this);  // Разворачиваем вызов, надёжно идентифицируя себя как круг
    }
 
    // Реализуем вычисление площади, зная тип нашей фигуры (круг) и второй фигуры
    virtual double getIntersectionC(const Circle& c) const;
    virtual double getIntersectionT(const Triangle& t) const;
    virtual double getIntersectionS(const Square& s) const;    
};
 
// Классы Triangle и Square реализуются аналогично
 
// Получим площадь пересечения фигур, зная их имена
double getIntersectionByNames(const Drawing& drawing, const string& name1, const string& name2)
{
    const Shape& shape1 = Drawing.getByName(name1); // Допустим, это Triangle
    const Shape& shape2 = Drawing.getByName(name2); // Допустим, это Circle
    return shape1.getIntersection(shape2);  // будет вызвана виртуальная функция Triangle::getIntersection, которая
    // в свою очередь вызовет у shape2 виртуальный метод Circle::getIntersectionT
}
3
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
31.03.2013, 13:12  [ТС]
Цитата Сообщение от Nick Alte Посмотреть сообщение
Есть хороший пример на графических примитивов в каком-нибудь векторном графическом редакторе. Допустим, есть общий предок Shape, от которого наследуются Circle, Square и Triangle (круг, квадрат, треугольник). Нам надо уметь определить площадь пересечения двух фигур. Очевидно, математика такого пересечения зависит от того, какие именно фигуры пересекаются. Но вот сам рисунок представлен в виде коллекции указателей на Shape, где мы можем выбрать произвольно два объекта и поинтересоваться площадью их пересечения. Вот тут-то и вступает в дело двойная диспетчеризация:
Да как раз эту задачу решаю.

Добавлено через 2 минуты
это называется полиморфизм.

Добавлено через 6 минут
У меня функция должна принимать два объекта типа Shape.

Добавлено через 43 секунды
И почему в производных классах от Shape функции виртуальные?
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
31.03.2013, 13:13
А давайте не будем разбрасываться терминами без их чёткого понимания. Виртуальные функции - штатное воплощение механизма динамического полиморфизма в C++. То, что я показал - реализация двойной диспетчеризации посредством этого механизма.
2
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
31.03.2013, 13:14  [ТС]
// Реализуем вычисление площади, зная тип нашей фигуры (круг) и второй фигуры
А вторая фигура это фигура имеется в веду объекта this?

Добавлено через 56 секунд
Nick Alte, Ок. Я еще подчитаю, а то я что такое виртуальная функция не сильно понимаю.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
31.03.2013, 13:15
Цитата Сообщение от ninja2 Посмотреть сообщение
И почему в производных классах от Shape функции виртуальные?
Потому что виртуальные функции предка остаются таковыми и у потомка, в этом-то весь их смысл. Заметим, что у класса Shape этих функций вообще нет, есть только возможность их вызова в потомке. Они остались бы виртуальными даже без слова virtual, но с ним запись получается чётче и яснее.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
31.03.2013, 13:31  [ТС]
Цитата Сообщение от Nick Alte Посмотреть сообщение
Потому что виртуальные функции предка остаются таковыми и у потомка, в этом-то весь их смысл. Заметим, что у класса Shape этих функций вообще нет, есть только возможность их вызова в потомке. Они остались бы виртуальными даже без слова virtual, но с ним запись получается чётче и яснее.
Помоему я где то читал, что виртуальные функции нужно переопределять, потому что они ничего не делают хз. или то чисто виртуальные функции? ,а обычные просто виртуальные функции это как бы флаг для производных классов, что их нужно переопределить. Запутался вообще.
(с определениями нада и правда разобраться)

Добавлено через 1 минуту
Щас протестирую можно ли для объекта класса с виртуальными функциями их вызвать.

Добавлено через 9 минут
Ладно тестить не будим просто вспомнил, что абстрактный класс это класс с чисто виртуальной функцией.
Чисто виртуальная функция это тупо пустая функция которую нужно переопределить в производном классе.
А просто виртуальная функция, это как обычная функция, токо с обязательным переопределением в производном классе. Вроде так.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
31.03.2013, 13:31
Виртуальные функции вызываются "по факту", в зависимости от реального типа объекта. Отсюда и название (virtual переводится как "фактический"). Иллюстрация:
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
#include <iostream>
using std::cout;
using std::endl;
 
class Base {
public:
    void foo() const {cout << "Base::foo" << endl;}
    virtual void bar() const {cout << "Base::bar" << endl;}
};
 
class Derived: public Base{
public:
    void foo() const {cout << "Derived::foo" << endl;}
    virtual void bar() const {cout << "Derived::bar" << endl;}
};
 
int main()
{
    Base b;
    Derived d;
    Base* pb = &d;
    b.foo();  // Печатает Base::foo
    b.bar();  // Печатает Base::bar
    d.foo();  // Печатает Derived::foo
    d.bar();  // Печатает Derived::bar
    pb->foo();    // Печатает Base::foo, хотя pb указывает на объект Derived, потому что pb имеет тип Base*
    pb->bar();    // Печатает Derived::bar, потому что функция виртуальная и вызывается через сам объект, который знает свой настоящий тип
}
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.03.2013, 13:34
ninja2,
Чисто виртуальная функция это тупо пустая функция которую нужно переопределить в производном классе.
Переопределить нужно, да. А вот что она тупо пустая - неверно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class Base
{
public:
   virtual ~Base() {}
   virtual void f() = 0;
};
 
void Base::f() { std::cout << "f" << std::endl; }
 
class Der : public Base
{
public:
   void f() { std::cout << "Der::f" << std::endl; Base::f(); }
};
 
int main()
{
   Base* b = new Der();
   b->f();
   delete b;
}
http://liveworkspace.org/code/3lblwO$0
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
31.03.2013, 13:34
Что-то как-то у вас всё сложно. Что такое двойная диспетчеризация поняли? Виртуальные функции — это реализация одинарной диспетчеризации. Принципиально она может быть сколько-угодно-арной.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
31.03.2013, 14:15  [ТС]
Цитата Сообщение от Nick Alte Посмотреть сообщение
Виртуальные функции вызываются "по факту", в зависимости от реального типа объекта. Отсюда и название (virtual переводится как "фактический"). Иллюстрация:
Так можно просто в классе Derived bar записать без virtual
отак:
C++
1
2
3
4
5
class Derived: public Base{
public:
    void foo() const {cout << "Derived::foo" << endl;}
    void bar() const {cout << "Derived::bar" << endl;}
};
и в программке то же самое выводится:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    Base b;
    Derived d;
    Base* pb = &d;
    b.foo();  // Печатает Base::foo
    b.bar();  // Печатает Base::bar
    d.foo();  // Печатает Derived::foo
    d.bar();  // Печатает Derived::bar
    pb->foo();    // Печатает Base::foo, хотя pb указывает на объект Derived, потому что pb имеет тип Base*
    pb->bar();    // Печатает Derived::bar, потому что функция виртуальная и вызывается через сам объект, который знает свой настоящий тип
}
Он же наверно смотрит по базовой виртуальной функции. (компилятор смотрит)

Добавлено через 5 минут
Ладно понял для чоткой записи virtual оставляем.
Спасибо всем щас буду на практике пробовать как чо работает.

Добавлено через 4 минуты
Щас я напишу простую программку реализующую двойную диспетчеризацию на примере Shape и производных Triangle, Square, и Rectangle. Зацените правильно ли сделал.

Добавлено через 20 минут
От написал ну чото это похоже на одинарную диспетчеризацию, яж ведь как бы одну функцию вызвал, только два объекта как параметры передал или это и есть двойная диспетчеризация?
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
#include <iostream>
using std::cout;
using std::endl;
 
class Shape
{
public:
    virtual void intersec(Shape a, Shape b){};//f opredel9yucha9 perecechenie
};
 
class Triangle : public Shape
{
public:
    virtual void intersec(Shape a, Shape b)
    {
        cout <<"intersec Triangle"<<endl;
    }
};
 
class Square : public Shape
{
public:
    virtual void intersec(Shape a, Shape b)
    {
        cout <<"intersec Square"<<endl;
    }
};
 
class Rectangle : public Shape
{
public:
    virtual void intersec(Shape a, Shape b)
    {
        cout <<"intersec Rectangle"<<endl;
    }
};
 
int main()
{
    Shape* Shape;
    Rectangle R;
    Triangle T;
    Square S;
    Shape=&R;
    Shape->intersec(R,T);//intersec Rectangle
    
    return 0;
}
Добавлено через 3 минуты
По условию задачи нужно два объекта передавать. Но я так смотрю можно б и один параметр хз. Второй же объект в самом классе как бы известен.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
31.03.2013, 18:00
Передавать нужно по ссылке или по указателю, иначе создаётся копия объекта Shape, в которую заливают соответствующий кусок более крутого объекта. Чтобы избежать такой глупости, в Shape должны быть чистые виртуальные функции. Внимательно смотрим код моего примера.
1
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
15.03.2021, 21:32
Цитата Сообщение от ninja2 Посмотреть сообщение
И еще хочу попытаться смоделировать на примере простых классов.
на примере непростых классов (нашла в сети)
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
94
95
96
97
98
99
100
// Understanding double dispatch C++
 
#include <iostream>
#include <vector>
 
#include <iostream>
 
using namespace std;
 
class A;
class A1;
class A2;
class B1;
class B2;
 
class B {
    public:
        // dispatcher function to A
        virtual void collide(const A& a) const = 0;
 
        // actual collision logic B with types of A
        virtual void collide(const A1& a) const = 0;
        virtual void collide(const A2& a) const = 0;
};
 
class A {
    public:
        // dispatcher function to B
        virtual void collide(const B& b) const = 0;
 
        // actual collision logic A with types of B
        virtual void collide(const B1& b) const = 0;
        virtual void collide(const B2& b) const = 0;
};
 
class A1 : public A {
    public:
        void collide(const B& b) const {
            // dispatch to b
            b.collide(*this);
        }
        void collide(const B1& b) const {
            cout << "collision with B1 and A1" << endl;
        }
        void collide(const B2& b) const {
            cout << "collision with B2 and A1" << endl;
        }
};
 
class A2 : public A {
    public:
        void collide(const B& b) const {
            // dispatch to a
            b.collide(*this);
        }
        void collide(const B1& b) const {
            cout << "collision with B1 and A2" << endl;
        }
        void collide(const B2& b) const {
            cout << "collision with B2 and A2" << endl;
        }
};
 
class B1 : public B {
    public:
        void collide(const A& b) const {
            b.collide(*this);
        }
        void collide(const A1& b) const {
            cout << "collision with A1 Bnd B1" << endl;
        }
        void collide(const A2& b) const {
            cout << "collision with A2 Bnd B1" << endl;
        }
};
 
class B2 : public B {
    public:
        void collide(const A& a) const {
            a.collide(*this);
        }
        void collide(const A1& a) const {
            cout << "collision with A1 Bnd B2" << endl;
        }
        void collide(const A2& a) const {
            cout << "collision with A2 Bnd B2" << endl;
        }
};
 
int main() {
 
    A* a = new A1();
    B* b = new B2();
 
    // first dispatch is done by polymorphism ( a is resolved as a A1 )
    // second dispatch is done in collide function by the function overloading
    // ( in collide function we are sending A1 to collide function of B )
    a->collide(*b);
 
}

Double dispatch лучше реализуется в Visitor pattern

Добавлено через 28 минут
хотя сам по себе паттерн призван решить некоторую громоздкость Double Dispatch (одна диспетчеризация в наследовании, 2я в перегрузке - и приходится перегружать всех членов - поэтому предпочтительнее декомпозировать и ввести посетителя - получится паттерн)...
но всё-таки его цикличность надо ещё побороть... чтобы добиться нормального (расширяемого далее) дизайна...
вообще, полагаю на данный момент std::visit и std::variant стали соотв. заменой в современном C++

Добавлено через 13 минут
вот напомнило мне всё это то, что у меня есть концептуально... а потом подумала - а у меня ведь даже в страшном сне это не будет делаться динамически (по логике) - вздохнула с облегчением... статических классов пока хватает (по концепции моего т.н. тз)...
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
17.03.2021, 20:08
хм, действительно, полезная вещь -
The point of double dispatch is to avoid explicit type selection based on RTTI
Understanding double dispatch C++
P.S.
single dispatcher
хотя с c++17 даже single dispetcher стал выглядеть совсем несложно
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T>
T dispatcher() {
// if T is double
if constexpr (std::is_same<T, double>::value)
return _func_double();
// if T is int
if constexpr (std::is_same<T, int>::value)
return _func_int();
// if T is char*
if constexpr (std::is_same<T, char*>::value)
return _func_char_pointer();
}
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
17.03.2021, 23:37
Цитата Сообщение от ninja2 Посмотреть сообщение
что такое двойная диспетчеризация
Выбор вызываемого метода по динамическому типу сразу двух указателей или ссылок. Такая штука поддерживается в CLOS. Помнится, еще в одной из первых книг Маейрса были заметки о возможности ее реализации в С++.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.03.2021, 01:05
Цитата Сообщение от jugu Посмотреть сообщение
Помнится, еще в одной из первых книг Маейрса были заметки о возможности ее реализации в С++.
https://rextester.com/FIMRD47976

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
#include <variant>
#include <iostream>
 
struct line {};
 
struct arc {};
 
struct intersects_algo
{
    bool operator()( const line&, const line&) const
    {
        std::cout<<"line vs line\n";
        return true;
    }
    bool operator()(const arc&, const arc&) const
    {
        std::cout<<"arc vs arc\n"; 
        return true;
    }
    bool operator()(const line&, const arc&) const
    {
        std::cout<<"line vs arc\n"; 
        return true;
    }
    bool operator()(const arc& a, const line& l) const
        { return this->operator()(l, a); }
};
 
using element = std::variant<line, arc>;
 
bool intersect(const element& e1, const element& e2 )
{
    return std::visit(intersects_algo(), e1, e2 );
}
 
int main()
{
    const element e1 = line {};
    const element e2 = arc {};
    const bool result = intersect(e1, e2);
    std::cout << "trsult: " << result << '\n';
}
1
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
18.03.2021, 08:38
не могу пройти мимо и не оставить линк для дальнейшего изучения - Использование double dispatch на примере разработки системы потокового вещания
p.s.
... но всё-таки мне кажется, что паттерн Visitor в современном C++ упрощается ещё и использованием лямбд (в том же visit-variant)...
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
18.03.2021, 08:40
Цитата Сообщение от jugu Посмотреть сообщение
одной из первых книг Маейрса
это как раз оттуда.
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
18.03.2021, 09:03
del
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2021, 09:03
Помогаю со студенческими работами здесь

двойная буферизация
Здравствуйте. Ребят не сочтите за труд, помогите разобраться. Проблема собственно вот в чём: Пишу тетрис, в окошке находится стакан с...

Двойная буферизация на С++
Можно её реализовать для консоли, а то больно уж сильно экран мигает. Если можно то подскажите как или линки дайте. Заранее спасибо

двойная буферизация
можете помочь мне нужен простой пример двойной буферизации а то уже второй день не могу разобраться...и если можно прокоментированый код....

Двойная спираль в C++
Нужно построить двумерный массив, с заполнением двойной спиралью. Самое сложное что сделать это нужно через один (For). For для вывода...

двойная сортировка
Необходимо отсортировать массив, как показано на рисунке, используя класс/структуру с двумя переменными а (левая колонка) и б (правая...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru