Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Заблокирован

Реализация аналога делегатов из C#

09.10.2015, 19:22. Показов 2756. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
я люблю писать велосипеды и я люблю c# и вот мне приспичило написать в c++ нечто по типу шарповых делегатов в принципе это оказалось куда проще чем кажется но вот в одном месте выдает вот такую странную ошибку, не знаю что с ней делать

бинарный "[": "std::list<int (__cdecl *)(int,int),std::allocator<_Ty>>" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору

и вот код, ошибка на 17 и точно такая же на 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
template <typename ResultType, typename ...ArgumentTypes>
class Delegate
{
public:
    typedef ResultType (*SignatureType)(ArgumentTypes...);
 
    Delegate() {}
 
    Delegate(SignatureType func)
    {
        functions.push_back(func);
    }
 
    ResultType operator()(ArgumentTypes... args)
    {
        for (size_t i = 0; i < functions.size() - 1; i++)
            functions[i](args...);
        return functions[functions.size() - 1](args...);
    }
 
    SignatureType operator=(SignatureType func)
    {
        functions.push_back(func);
        return func;
    }
 
    SignatureType operator+=(SignatureType func)
    {
        functions.push_back(func);
        return func;
    }
 
    SignatureType operator-=(SignatureType func)
    {
        functions.remove(func);
        return func;
    }
 
private:
    std::list<SignatureType> functions;
};
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.10.2015, 19:22
Ответы с готовыми решениями:

Реализация аналога netstat -bn
Необходимо создать Windows Service, который через каждый час пишет в log.txt информацию аналогично netstat.exe -bno. Можно даже netstat...

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

Реализация аналога категорий
На modx evo нужно реализовать следующее: Имеется документ, который является корневым. В этом документе лежат папки, которые по сути...

17
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
09.10.2015, 19:37
В контейнере list нет оператора произвольного доступа (квадратных скобок), это же список.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.10.2015, 19:45
Лучший ответ Сообщение было отмечено Volrajas как решение

Решение

заменить:
C++
1
2
3
4
5
6
ResultType operator()(ArgumentTypes... args)
    {
        for (size_t i = 0; i < functions.size() - 1; i++)
            functions[i](args...);
        return functions[functions.size() - 1](args...);
    }
на:

C++
1
2
3
4
5
6
7
ResultType operator()(ArgumentTypes... args)
    {
        auto end = functions.cend(); --e;
        for (const auto current = functions.cbegin(); current!=end; ++i)
            (*current)(args...);
        return (*end)(args...);
    }
зы: дизайн на редкость ужассен.
1
Заблокирован
09.10.2015, 20:02  [ТС]
Цитата Сообщение от Nick Alte Посмотреть сообщение
В контейнере list нет оператора произвольного доступа (квадратных скобок), это же список.
ааа тьфу ты забыл... в шарпе прост в списке есть произвольный доступ, а тут нет я путаюсь временами

hoggy, не совсем то что нужно, мне же не надо чтобы последняя в списке функция выполнялась два раза, как сделать чтоб этого не было? она должна вернуть значение в return-е
Цитата Сообщение от hoggy Посмотреть сообщение
зы: дизайн на редкость ужассен.
а что такого уж ужасного?

Добавлено через 11 минут
ау люди как мне сделать цикл именно до предпоследнего элемента??? я реально не знаю чет вообще...
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
09.10.2015, 20:07
Цитата Сообщение от Volrajas Посмотреть сообщение
ау люди как мне сделать цикл именно до предпоследнего элемента???
У hoggy всё правильно написано, цикл до предпоследнего, потом возвращается результат вызова последнего. Вот только в случае пустого списка будет бдыщь.
0
Заблокирован
09.10.2015, 20:10  [ТС]
аа кажется понял, там просто ошибочка "--e", а надо "--end" и еще не "++i", а "++current", но когда я делаю "++current" у меня кидает ошибку

бинарный "++": не найден оператор, принимающий левый операнд типа "const std::_List_const_iterator<std::_List_val <std::_List_simple_types<int (__cdecl *)(int,int)>>>" (или приемлемое преобразование отсутствует)

Добавлено через 54 секунды
Цитата Сообщение от Nick Alte Посмотреть сообщение
Вот только в случае пустого списка будет бдыщь.
я введу дополнительную проверку это ерунда

Добавлено через 1 минуту
Цитата Сообщение от Volrajas Посмотреть сообщение
но когда я делаю "++current" у меня кидает ошибку
все разобрался во первых const там он зря сделал, во вторых наверно будет лучше auto &current, то бишь ссылку, так как то правильнее
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
09.10.2015, 20:11
Вообще проще будет не заморачиваться, а сохранять результат каждого вызова:
C++
1
2
3
4
ResultType rv; 
for(auto fptr: functions)
    rv = fptr(std::forward<ArgumentTypes>(args)...);
return rv;
.
0
Заблокирован
09.10.2015, 20:11  [ТС]
и все таки интересно просто чем так плох дизайн?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.10.2015, 20:34
Цитата Сообщение от Volrajas Посмотреть сообщение
и все таки интересно просто чем так плох дизайн?
1.
Цитата Сообщение от Volrajas Посмотреть сообщение
typedef ResultType (*SignatureType)(ArgumentTypes...);
работает только с свободными функциями.
на с++ основной упор делается на класс (ООП).

2.
решение потенциально не эффективно:
везде все передается по значению.
например:
Цитата Сообщение от Volrajas Посмотреть сообщение
ResultType operator()(ArgumentTypes... args)
копируем аргументы, копируем возвращаемое значение.

Цитата Сообщение от Volrajas Посмотреть сообщение
SignatureType operator=(SignatureType func)
* * {
* * * * functions.push_back(func);
* * * * return func;
* * }
в чем заключается сакральный смысл подобного оператора присвоения?
каноническая форма оператора присвоения знаете какая?

но это все ладно.
это детали реализации.

самый главный фейл - дизайн использования.
вот это только на выброс.

вы вообще осознаете принцип использования вашего механизма?

вот это - лютый фейл:
C++
1
2
3
4
5
6
ResultType operator()(ArgumentTypes... args)
    {
        for (size_t i = 0; i < functions.size() - 1; i++)
            functions[i](args...);
        return functions[functions.size() - 1](args...);
    }
называется он "профакапить все возвращаемые значения функций,
кроме одной, и в итоге поиметь непредсказуемый результат".

вот здесь у вас - источник хаоса в программе.
поведение будет меняться в зависимости от того,
что запихали в делегат последним.

то есть, вызывающая сторона (а их у вас несколько, потому что несколько клиентов могут покласть свои лаучеры в делегат)
у вас должна постоянно париться, что там в делегате.
и не дай бог, какой нибудь засранец затолкал не то, что нужно.

и это уже само по себе нарушает не только принципы ООП: инкапсуляцию, инварианты.
но и противоречит смыслу существования паттерна "делегат".

делегат применяется для опосредованного запуска удаленной функции или функции-члена в условиях,
когда вызывающая сторона не хочет знать,
кого именно она дергает.

а в вашем случае - источник постоянных ошибок,
и знать ой как сильно придется.
0
Заблокирован
09.10.2015, 21:07  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
работает только с свободными функциями.
на с++ основной упор делается на класс (ООП).
согласен, я подумаю над этим, кстати может подкинете идейку как сделать чтоб можно было запихивать функции от объектов?
Цитата Сообщение от hoggy Посмотреть сообщение
решение потенциально не эффективно:
везде все передается по значению.
тоже согласен, но с другой стороны, а не будет ли проблем с прототипом если я буду передавать по ссылке? может в оригинале оказаться что и по значению передаются... а возвращаемое значение по ссылке вообще никак не передашь если это функция не от объекта (оно же уничтожется)
Цитата Сообщение от hoggy Посмотреть сообщение
называется он "профакапить все возвращаемые значения функций,
кроме одной, и в итоге поиметь непредсказуемый результат".
вот здесь у вас - источник хаоса в программе.
поведение будет меняться в зависимости от того,
что запихали в делегат последним.
то есть, вызывающая сторона (а их у вас несколько, потому что несколько клиентов могут покласть свои лаучеры в делегат)
у вас должна постоянно париться, что там в делегате.
и не дай бог, какой нибудь засранец затолкал не то, что нужно.
и это уже само по себе нарушает не только принципы ООП: инкапсуляцию, инварианты.
но и противоречит смыслу существования паттерна "делегат".
делегат применяется для опосредованного запуска удаленной функции или функции-члена в условиях,
когда вызывающая сторона не хочет знать,
кого именно она дергает.
а в вашем случае - источник постоянных ошибок,
и знать ой как сильно придется.
а вот тут честно говоря вообще не понял что вы написали...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.10.2015, 23:45
Цитата Сообщение от Volrajas Посмотреть сообщение
может подкинете идейку как сделать чтоб можно было запихивать функции от объектов?
как то так:
http://rextester.com/FCM91730

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
#include <memory>
#include <string>
 
template <class R, class... Args> struct ILauncher
{
    virtual ~ILauncher(){}
    virtual R operator()(Args&&...)const = 0;
};
 
template <class F, class R, class... Args> 
struct Function: public ILauncher<R, Args...>
{
    Function(F& f):mFunc(f){}
    
    R operator()(Args&&... args)const
        { return mFunc(std::forward<Args>(args)... ); }
private:
    F mFunc;
};
 
template <class O, class F, class R, class... Args> 
struct Method: public ILauncher<R, Args...>
{
    Method(O& o, F& f)
        :mObj(std::forward<O>(o))
        ,mFunc(f)
    {}
    
    R operator()(Args&&... args)const
        { return (mObj.*mFunc)(std::forward<Args>(args)... ); }
private:
    O mObj;
    F mFunc;
};
 
 
// --- главный шаблон не нуждается в туловище
template <class T> class Delegate;
    
    
// --- специализация для случая, когда делегат
// бал параметризирован типом функции    
template <class R, class... Args> 
class Delegate<R(Args...)>
{
    typedef ILauncher<R, Args...>
        ILauncher_;
    
    typedef std::shared_ptr<ILauncher_>
        SLauncher;
    
public:
    template<class F>
    Delegate(F&& f)
        : mLauncher(std::make_shared<Function<F, R, Args...> >(f) )
    {};
 
    template<class O, class F>
    Delegate(O&& o, F&& f)
        : mLauncher(std::make_shared<Method<O, F, R, Args...> >( std::forward<O>(o), f) )
    {};
    
    
    R operator()(Args&&... args)const
        { return (*mLauncher)(std::forward<Args>(args)... ); }
    
private:
    SLauncher mLauncher;
    
};    
 
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
 
#ifndef OUT_TO_STREAM
    #define OUT_TO_STREAM(type_)  \
        template<class T>friend   \
        ::std::basic_ostream<T>&  \
        operator<<(::std::basic_ostream<T>& os, const type_& obj )
#endif
 
 
int foo(int v) { 
    std::cout<<"[function foo("<<v<<"); was executed, and returned " << v*2<<']'; 
    return v*2; 
} 
 
struct sample
{
    OUT_TO_STREAM(sample)
    {
        return os << "name: " << obj.mName <<" : age: " << obj.mAge;
    }
    
    sample(){ std::cout<<"sample was build\n"; }
    sample(const sample&){ std::cout<<"sample was copied\n"; }
    sample(sample&&){ std::cout<<"sample was moved\n"; }
 
    int bar(const sample& v)const { 
        std::cout<<"[method sample::bar("<<v<<"); was executed, and returned " << mAge <<']'; 
        return mAge; 
    } 
    
    std::string mName="Volrajas";
    size_t      mAge=25;
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    Delegate<int(int)> call1 = foo;
    std::cout<<" response: "<< call1(10) << std::endl;
    
    sample s;
    Delegate<int(const sample&)> call2(s, &sample::bar);
    std::cout<<" response: "<< call2(s) << std::endl;
    
    Delegate<int(bool)> call3 = [](bool b)
    { 
        std::cout<< "[lambda("<< (b? "true":"false") <<"); was executed, and returned 10]"; 
        return 10;
    };
    std::cout<<" response: "<< call3(true) << std::endl;
    
}
реальная реализация на самом деле на порядок сложнее,
потому что:
1.
нужно предусмотреть стратегию оптимальной передачи возвращаемого значения.
2.
возможность биндить аргументы.
3.
оптимизация хранения функторов
(std::shared_ptr оч не эффективное средство)
4.
ещё вагон и тележка нюансов.

Цитата Сообщение от Volrajas Посмотреть сообщение
а не будет ли проблем с прототипом если я буду передавать по ссылке?
конечно будут.
хорошая новость в том, что у вас в распоряжении
мощнейшая система изнасилования типов времени компиляции:
метапрограммирования на шаблонах творит чудеса.
все что понадобится - порешать ряд инженерных задач.

Цитата Сообщение от Volrajas Посмотреть сообщение
а вот тут честно говоря вообще не понял что вы написали...
а вот тут самое главное.

делегат - это инструментальный механизм общего назначения.
он предназначен для использования в самых разных проектах пользователей.

просто подумайте о том,
как предполагается использовать вашу версию делегата.

ваш дизайн совершенно не практичен.
1
Заблокирован
10.10.2015, 08:36  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
как то так:
елы палы... это ж ппц, я просто брал вдохновение из этой статьи, и там тоже был почти такой же жуткий сложный код, я так и не осилил пока что в нем до конца разобраться, решил схалтурить и набросал такой вот сильно упрощенный вариант, а тут еще у вас почти то же самое ладно буду разбираться
Цитата Сообщение от hoggy Посмотреть сообщение
нужно предусмотреть стратегию оптимальной передачи возвращаемого значения.
а move не подойдет?
Цитата Сообщение от hoggy Посмотреть сообщение
возможность биндить аргументы.
надо подумать не работал еще с этим ужасом
Цитата Сообщение от hoggy Посмотреть сообщение
оптимизация хранения функторов
(std::shared_ptr оч не эффективное средство)
какие еще функторы, я вроде их еще не использовал... (ну кроме самого делегата) или вы про список указателей на функции? а что список юзает shared_ptr? и почему он не оч эффективное средство? я как раз недавно про него читал, подумал наоборот прикольная штука, хотя я и так обычно не забываю за собой чистить память, да и много выделять не часто приходится...
Цитата Сообщение от hoggy Посмотреть сообщение
конечно будут.
погодите я тут подумал, а собственно что не так с передачей параметров? просто указываешь в аргументах шаблона ссылки или там указатели и все... Delegate<int, int&> разве нет?
Цитата Сообщение от hoggy Посмотреть сообщение
хорошая новость в том, что у вас в распоряжении
мощнейшая система изнасилования типов времени компиляции:
метапрограммирования на шаблонах творит чудеса.
все что понадобится - порешать ряд инженерных задач.
так уж и мощнейшая? вот в шарпе там да можно насиловать прямо в рантайме боюсь не осилю я думал будет проще все это сделать... ну ладно посмотрим мож че и выйдет
Цитата Сообщение от hoggy Посмотреть сообщение
а вот тут самое главное.
делегат - это инструментальный механизм общего назначения.
он предназначен для использования в самых разных проектах пользователей.
просто подумайте о том,
как предполагается использовать вашу версию делегата.
ваш дизайн совершенно не практичен.
эмм подумал все равно не понимаю чем так не практичен мой дизайн... если вы про изначальный цикл, то ок я заменил уже на вашу версию
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
10.10.2015, 09:13
Цитата Сообщение от Volrajas Посмотреть сообщение
так уж и мощнейшая? вот в шарпе там да можно насиловать прямо в рантайме
Видимо всё-таки придётся использовать
Цитата Сообщение от hoggy Посмотреть сообщение
мощнейшая система изнасилования типов времени компиляции:
потому что в шарпе делегат - это не просто экземпляр класса. Во время компиляции создаётся скрытый класс под конкретные типы аргументов и со всеми методами.
Цитата Сообщение от Volrajas Посмотреть сообщение
ладно буду разбираться
Хочу увидеть реализацию BeginInoke()/EndInvoke() на плюсах
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.10.2015, 11:16
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Хочу увидеть реализацию BeginInoke()/EndInvoke() на плюсах
Чем тебя std::async не устроил?
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
10.10.2015, 11:20
Цитата Сообщение от DrOffset Посмотреть сообщение
Чем тебя std::async не устроил?
Мне просто интересно, что там автор нагородит, я не спорю, что это вполне возможно.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.10.2015, 11:48
Цитата Сообщение от tezaurismosis Посмотреть сообщение
автор нагородит
Так я о том и говорю, что если брать новые стандарты, то и городить ничего не надо.
Если делать реализацию на С++03, то тут уже без привлечения платформо-зависимого API не получится, т.к. многопоточности в старых стандартах не было. Притом что код реализации этого на С++ вместе с, например, pthread будет не таким уж и сложным (в отличие от кода делегата, который на С++03 будет гораздо многословнее).
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.10.2015, 15:53
Цитата Сообщение от Volrajas Посмотреть сообщение
а move не подойдет?
не пойдет.

рассмотрим функцию:

C++
1
sample foo();
вызов этой функции через делегат должен иметь точно такие же побочные эффекты,
как и вызов напрямую.
причем независимо от конфигурации сборки
(не зависимо от режима оптимизаций компилятора)

не факт, что sample умеет move-конструктор.
и не факт, что компилятор сумеет оптимизировать RVO/NRVO возврат значения.
(вижалстудия вообще не делает RVO/NRVO для дебага, например)

я когда то делал делегаты c++03, принцип был следующий:

C++
1
type call(params);
если type - ссылочный(указательный) тип - возвращаем "как есть".
но если type - тип-значение,
то конкретный лаунчер сохраняет его внутри себя,
а наружу выкидывает ссылку.
таким образом удалось решить проблему "избыточных копирований".

Цитата Сообщение от Volrajas Посмотреть сообщение
и почему он не оч эффективное средство?
потому что аллоцирует захваченный ресурс в куче. а это - тормозная операция.
в общем случае это не эффективно.
здесь есть простор для разных стратегий оптимизаций.

Цитата Сообщение от Volrajas Посмотреть сообщение
погодите я тут подумал, а собственно что не так с передачей параметров? просто указываешь в аргументах шаблона ссылки или там указатели и все... Delegate<int, int&> разве нет?
такой подход - ущербный для юзабилити инструмента.
пользователь не должен вникать в детали реализации вашего делегата,
и парить себе голову: не налажает ли он с передачей аргументов?

когда у вас возникают сомнения - смотрите в сторону std::function.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
sample foo(sample); //<--- одно копирование на результат, и ещё одно на приемку
 
...
 
std::function<sample(sample)> call = foo; //<--- параметризую тем же типом
         // что и тип функции, которую нужно запустить
 
sample obj1;
 
sample obj2 = call(obj1);  //<--- при запуске делегата
   // имею эффекты идентичные прямому вызову
   // то бишь не более одного копирование на результат
   // и не более одного копирования на входной аргумент
Цитата Сообщение от Volrajas Посмотреть сообщение
так уж и мощнейшая? вот в шарпе там да можно насиловать прямо в рантайме
в том то и суть, что бы насиловать типы времени компиляции,
и не иметь шрафных пенальти в рантайме.


Цитата Сообщение от Volrajas Посмотреть сообщение
я думал будет проще все это сделать
к вашим услугам: std::function, std::bind, лямбды.
Цитата Сообщение от Volrajas Посмотреть сообщение
эмм подумал все равно не понимаю чем так не практичен мой дизайн...
это плохо.
это значит, что вы не понимаете что такое "делегат",
какова его "область применения",
и каким вы видите "дизайн использования" вашего делегата.

вы пытаетесь закодить без понимания сути решаемой задачи.

и пока вы этого не поймете,
имхо - нет смысла пытаться писать реализацию.

Добавлено через 3 минуты
Цитата Сообщение от tezaurismosis Посмотреть сообщение
потому что в шарпе делегат - это не просто экземпляр класса.
не помню, что бы я интересовался у вас сишарпом.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
10.10.2015, 16:03
Цитата Сообщение от hoggy Посмотреть сообщение
не помню, что бы я интересовался у вас сишарпом.
Это не для вас написано.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.10.2015, 16:03
Помогаю со студенческими работами здесь

Реализация аналога Сишной функции strtok
Нужна реализация именно на Turbo Pascal аналога Си-шной функции strtok. Помогите. Документация:function &lt;cstring&gt; strtok ...

Sha1, реализация аналога php функции
Помогите написать аналог php функции на c#,вот то что я написал,но результат не тот( StringBuilder majorsalt = new StringBuilder(); ...

[WPF] Реализация аналога окна Сервис - Параметры из VS
как в wpf реализовать окно vs сервис - параметры. TreeView в одной ячейке Grid, при клике по узлу в другая ячейка обновлялась.

Реализация аналога приватной комнаты для службы поддержки
Привет, хочу сделать на сайте службу поддержки. Структура БД такова: id | author_id | date | message | status . НЕ подскажите, как сделать...

Функции как параметры метода. (реализация с помощью делегатов)
Есть две функции, с разными количествами параметров и с разными типами этих параметров и есть метод который генерирует график каждой...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru