• Как можно разделить данный код (см. ниже) по header'ам и cpp'ам, учитывая зависимости в нём?

    В общем случае - каждый класс должен быть в отдельных *.h и *.cpp файлах
    Ответ написан
    Комментировать
  • Как можно разделить данный код (см. ниже) по header'ам и cpp'ам, учитывая зависимости в нём?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как я могу это сделать?

    Разносишь определения классов по файлам *.h. Разносишь определения методов классов по одноимённым файлам *.cc, инклудишь в них одноимённые *.h Потом смотришь на свою картинку. Стрелки наследования и агрегации добавляют include <файл в конце стрелки> в h файл в начале стрелки. Стрелки использования добавляют include <файл в конце стрелки> в cc файл в начале стрелки.
    Ответ написан
    1 комментарий
  • Какую бесплатную глобальную базу данных вы порекомендуете для хранения данных пользователей (логин, имя, дата авторизации и т. п.)?

    @rPman
    комп будет выключаться и сервер соответственно тоже,

    к ней всегда будет доступ

    Сервер нужен так или иначе, не важно где он запущен.

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

    Точно помню был шуточный проект вики-справочника, как пример работы с webrtc (технология peer-to-peer подключений для веб приложений, на его основе к примеру работает webtorrent), где странички хранились исключительно в памяти пользовательских браузеров, пока на них кто то смотрит.
    Ответ написан
    Комментировать
  • Почему метод Cancel() объекта cancelTokenSource действует и на объект Task, которому в параметры конструктора токен не передаётся (см. внутри)?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    CancellationToken, передаваемый коструктору Task, не имеет никакого отношения к делегату, составляющему тело задачи (у вас им является ваша лямбда-функция). Он служит для отмены самой задачи, пока она ещё не запущена на выполнение. А делегат тела задачи даже не может просто взять и обратиться к этому CancellationToken. И, чтобы делегат мог с ним работать, этот CancellationToken надо передать делегату каким-то другим образом.
    Вы передаете этот CancellationToken через замыкание лямбда-функции (это умное слово означает, что вы просто сослались в ней на эту переменную). Причем, вы его передаете в тело и той, и другой задачи, через одну и ту же переменную token. Именно поэтому при вызове Cancel() для источника этого CancellationToken (cancelTokenSource) обе задачи обнаруживают этот факт и прекращают свое выполнение.
    PS Если интересует, где про это прочитать побольше, то - в книге Дж.Рихтера "Программирование на платформе Microsoft .NET Framework 4.5 на языке Csharp, CLR via Csharp" в гл.27 (в более новом издании, если такое есть, номер главы может измениться).
    Ответ написан
    2 комментария
  • Почему метод Cancel() объекта cancelTokenSource действует и на объект Task, которому в параметры конструктора токен не передаётся (см. внутри)?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    вообще то твой код не работает в дотнет8, при прямом копировании. ошибок не дает, но и ни чего не печатает.. поиграюсь.. а так то... смотри внимательно:
    CancellationToken token = cancelTokenSource.Token;
    ///...
        Task task2 = new Task(() =>
        {
            for (int i = 1; i < 10; i++)
            {
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("Операция прервана");
                    return;
                }
                Console.WriteLine($"2. Квадрат числа {i} равен {i * i}");
                Thread.Sleep(200);
            }
        });
    .. они у тебя в одной области видимости, и ты бодро проверяешь статус завершения.. зачем? ;)))
    ... решения?.. ну простейшее - CancellationTokenSource2 ... не быть же второй таске вечной..

    ps
    в 4,8 работает так
    using System.Threading.Tasks;
    using System.Threading;
    using System;
    
    class cancelTokenTest
    {
        static void Main(string[] args)
        {
            var cancelTokenSource = new CancellationTokenSource();
            var token = cancelTokenSource.Token;
    
            var cancelTokenSource2 = new CancellationTokenSource();
            var token2 = cancelTokenSource2.Token;
    
            var task = new Task(() =>
            {
                for (int i = 1; i < 100000; i++)
                {
                    if (token.IsCancellationRequested)
                    {
                        Console.WriteLine("Операция 1 прервана");
                        return;
                    }
                    Console.WriteLine($"1. Квадрат числа {i} равен {i * i}");
                    Thread.Sleep(200);
                }
            }, token);
    
            var task2 = new Task(() =>
            {
                for (int i = 10; i < 1000000; i++)
                {
                    if (token2.IsCancellationRequested)
                    {
                        Console.WriteLine("Операция 2 прервана");
                        return;
                    }
                    Console.WriteLine($"2. Квадрат числа {i} равен {i * i}");
                    Thread.Sleep(200);
                }
            }, token2);
    
            task.Start();
            task2.Start();
    
            Thread.Sleep(1000);
            cancelTokenSource.Cancel();
            Thread.Sleep(50); // без этого не успевает обновиться статус у меня..
            Console.WriteLine($"Task Status 1: {task.Status}");
            Thread.Sleep(1000);
            cancelTokenSource2.Cancel();
            Thread.Sleep(200); // можете закаментить для сравнения, и поиграть со значениями..
            Console.WriteLine($"Task Status 2: {task2.Status}");
            cancelTokenSource.Dispose();
            cancelTokenSource2.Dispose();
        }
    }
    в дотнет 8 ... не сразу... но
    может устаревшие методы? но компилируются.. топят в пользу асинхронки?
    ... вот пример для 8
    https://learn.microsoft.com/ru-ru/dotnet/api/syste...
    обратите внимание на использование CancellationToken, он действительно обрывает исполнение до начала. можно конечно попытаться адаптировать под ваш случай.. но это если опять будет сильно не чего делать.. не отписывайтесь )))
    using System.Runtime.CompilerServices;
    
    public static class cancelTokenTest8and2task
    {
        public static void print(this string s) => Console.WriteLine(s);
        public static void Main()
        {
            var ts1 = new CancellationTokenSource();
            var tk1 = ts1.Token;
    
            var ts2 = new CancellationTokenSource();
            var tk2 = ts2.Token;
    
    
            var t1 = new Task(() => {
                for (int i = 1; i < 100000; i++)
                {
                    if (tk1.IsCancellationRequested)
                    {
                        "Операция t1 прервана".print();
                        return;
                    }
                    $"t1. Квадрат числа {i} равен {i * i}".print();
                    Thread.Sleep(200);
                }
            });
    
            var t2 = new Task(() => {
                for (int i = 1; i < 100000; i++)
                {
                    if (tk2.IsCancellationRequested)
                    {
                        "Операция t2 прервана".print();
                        return;
                    }
                    $"t2. Корень числа {i} равен {Math.Sqrt(i)}".print();
                    Thread.Sleep(200);
                }
            });
    
            t1.Start();
            t2.Start();
            Thread.Sleep(1000);
            ts1.Cancel();
            Thread.Sleep(50);
            $"\nTask1 status: {t1.Status}".print();
    
            Thread.Sleep(1000);
            ts2.Cancel();
            Thread.Sleep(200);
            $"\nTask2 status: {t2.Status}".print();
            ts1.Dispose();
            ts2.Dispose();
        }
    }
    работает в дот нет 8 ... кроме using System.Runtime.CompilerServices; я разницы пока не вижу (имена не в счет!)...
    Ответ написан
    Комментировать
  • Как вызвать поток дважды поочерёдно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Используй join() для последовательного выполнения потоков.
    Ответ написан
    Комментировать
  • Как вызвать поток дважды поочерёдно?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Поток повторно запустить нельзя. После th1.join() (этот вызов дожидается завершения потока) cоздайте новый поток, присвойте его нужной переменой - да хоть той же th1 - и запустите его: будет функциональный аналог Task.ContinueWith(). Или же запустите th2, который у вас уже создан, но не запущен.
    Если вы хотите сделать два вызова Print в одном потоке - сделайте. Если между первым и вторым вызовом надо выполнить какой-нибудь код в основном потоке, то придется использовать объекты синхронизации, в данном случае - события, и ждать на них. Про это курите тему ManualResetEvent/AutoResetEvent, в двух словах в ответе всю эту тему не объяснить
    Ответ написан
    Комментировать
  • Как найти наикратчайшие пути взвешенного орграфа, представленного матрицей инцидентности, используя алгоритм Дейкстры?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Матрица инцидентности - абсолютно не эффективная структра представления графа практически для всех алгоритмов. Поэтому вы ее использование нигде найти и не можете.

    Если уж такое задание и надо именно это делать, то берете любую реализацию алгоритма дейкстры, скажем, со списком смежности и ищите там то место, где происходит перебор всех соседних вершин. И переписываете его: Чтобы найти все соседние вершины, вам надо пройтись по списку всех ребер и, если в матрице в столбце текущей вершины стоит отрицательное число, то ищите в этой строке положительное число - и вот тот столбец это и есть соседняя вершина.

    Кстати, у вас матрица инцидентности неправильная: должно быть по 2 числа в каждой строке. Обычно ставят -цену у начальной вершины и +цену у конечной.
    Ответ написан
    4 комментария
  • Как нарисовать кривую Серпинского (см. ниже), не используя графические библиотеки, а '*' или слешы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Самый простой путь - рисовать эту картинку внутри матрицы (растр).
    А потом перевести элементы этой матрицы в псевдографику https://en.wikipedia.org/wiki/Box-drawing_character

    Но я тебе это не советую, потому что выглядит как сильно грубое разрешение.

    Рисование слешами или зведочками возможно. Но это ASCII art. Иногда выглядит красиво
    а иногда вообще нечитабельно.
    Ответ написан
    4 комментария
  • Как нарисовать кривую Серпинского (см. ниже), не используя графические библиотеки, а '*' или слешы?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Напрягает требование, что нельзя использовать контейнеры. Так-то ваш подход правильный: Заводим поле для вывода, рекурсивной функцией, которой передаются порядок кривой, и где ее рисовать (квадрат и его поворот). Функция рекурсивно вызывает 4 кусокчка в каждом из 4 квадратов и рисует 3 соединительных кусочка. Но поле для вывода это так или иначе массив. Можно и самому его завести, но почему нульзя использовать контейнеры - не понятно.

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

    А потом циклом выводим результат работы функции для всех координат. Это работает в логарифм раз медленее, но зато не требует выделения памяти под все поле вывода.

    edit: Да, еще есть трюк - считайте, что кривая не замкнута. Левый верхний угол - пустота. И надо отдельно в самом конце замкнуть ее в этом углу через "/".
    Ответ написан
    6 комментариев
  • Как исправить "TypeError: this.hotKeys is undefined" (Firefox) и "TypeError: Cannot read properties of undefined (reading 'set')" (Chrome)?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    this.hotKeys = new Map();
    В начале конструктора))
    Ответ написан
    Комментировать
  • Обязательно ли кабель должен быть проведён к роутеру через модем или использование модема необязательно?

    @res2001
    Developer, ex-admin
    Все зависит от того какой кабель. В роутере обычно разъемы Ethernet (8 или 4 жильный кабель с разъемом RJ45) и в них можно сунуть только Ethernet (ни оптику, ни телефонную линию, и т.д.).
    Если в квартиру заходит что-то отличное от Ethernet, то требуется устройство, которое будет преобразовывать один тип сигнала в другой (например оптику в Ethernet, или DSL в ethernet), отсюда появляются дополнительные устройства на входе в роутер. Эти дополнительные устройства не всегда называются модемами, для оптики, например, устройство имеет более общее название медиа конвертер (преобразователь интерфейсов). Модем это то же медиа конвертер.
    Бывают модели роутеров, которые имеют внешний порт не Ethernet (оптика, DSL). Такие роутеры, как правило, используются именно там где входящая линия именно этого типа. Тогда, конечно, дополнительное устройство не требуется.
    Так же часто на входе уже имеется Ethernet, тогда такой кабель можно напрямую втыкать в роутер, без посредников.
    Ответ написан
    Комментировать
  • Обязательно ли кабель должен быть проведён к роутеру через модем или использование модема необязательно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В настоящее время модем уже не нужен. Это морально-устаревшие технологии 2000х годов когда интернет пускали по сетям телефона или по коаксиальному кабелю телевидения. Вот для таких стеков и ставился модем. Более того. Такие квази-телевизорные сети работали очень хреново (у меня был максимум 25 мегабит) и еще и асимметрично. Тоесть скорость в upload была раз в 10 медленнее чем в download.

    Сейчас вне нормальные провайдеры домашнего инета тянут ethernet (витая пара) до каждой квартиры. А модемы остались только у ваших бабушек.
    Ответ написан
    4 комментария
  • Обязательно ли кабель должен быть проведён к роутеру через модем или использование модема необязательно?

    Griboks
    @Griboks
    Советую освежить свои знания о том, что такое модем и роутер. Эти устройства выполняют две разные функции, поэтому независимы. Использование определяется архитектурой сети
    Ответ написан
    Комментировать
  • Какую книгу по системному администрированию и тому, как устроены компьютеры, вы могли бы посоветовать новичку?

    yakovlev_13
    @yakovlev_13
    Шаманство, экзорцизм и некромантия.
    Спасибо за ссылку. В телеге множество книг, что можно скачать и всё в одном месте.
    Я вот об этой
    https://vk.com/wall-51126445_63645
    Ответ написан
    Комментировать
  • Какую книгу по системному администрированию и тому, как устроены компьютеры, вы могли бы посоветовать новичку?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    https://vk.com/wall-51126445_63645
    Руководство системного администратора Unix.
    При вашей связке откровенно плевать на железо и как оно там устроено.
    Вас интересуют задержки и абсолютные параметры проца, сети, ввода вывода.
    Ответ написан
    2 комментария
  • Какую книгу по системному администрированию и тому, как устроены компьютеры, вы могли бы посоветовать новичку?

    @kalsc12345
    Неизвестный человек.
    Тогда для старта рекомендую гуглить - Рудольф Сворень Электроника шаг за шагом
    Ответ написан
    Комментировать
  • Какой текстовый редактор (среду разработки?) стоит выбрать для изучения и разработки на Python: VS 2019 или PyCharm?

    vabka
    @vabka
    Токсичный шарпист
    Все хороши. Скачайте все и пользуйтесь каждым неделю - ничего не потеряете, и узнаете, что для вас удобнее.
    Можете даже взять триал pycharm pro, и узнать, стоит ли он своих денег
    Ответ написан
    Комментировать
  • Какой текстовый редактор (среду разработки?) стоит выбрать для изучения и разработки на Python: VS 2019 или PyCharm?

    SoreMix
    @SoreMix
    yellow
    Хоть какой, лишь бы не python idle. Просто вкусовщина. Вам от ide нужно то по сути подсветку синтаксиса и подсказки при вводе.
    Попробуйте первый, второй, хотя бы по неделе. Что больше приглянется - то и используйте. Тем более для учебы
    Ответ написан
    4 комментария
  • Как можно отсортировать массив по количеству наиболее повторяемых значений?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Можно как-то так через кастомный IComparer:
    var arr = new int[] { 1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 5, 6, 6, 7, 8 };
    
    var index = arr.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count());
    var result = arr.OrderByDescending(x => x, new CountComparer(index)).ToArray();
    
    class CountComparer : IComparer<int>
    {
        private readonly IReadOnlyDictionary<int, int> _index;
        public CountComparer(IReadOnlyDictionary<int, int> index)
        {
            _index = index;
        }
    
        public int Compare(int x, int y)
        {
            var comparsion = _index[x].CompareTo(_index[y]);
            if (comparsion == 0)
                return x.CompareTo(y);
            return comparsion;
        }
    }

    Ну или можно самому написать алгоритм, но всё равно первым шагом надо будет пройтись по всему массиву с подсчётом повторений.
    Хотя мб можно как-то оптимизировать, если предположить, что изначально массив отсортирован по возрастанию.
    Ответ написан
    Комментировать