Задать вопрос
  • Как на обычном ПК сделать доступ по ссылке?

    @res2001
    Предложили как-то сделать адрес сайта через какой-то сервис

    Какой-то сервис называется, видимо, DDNS. Нужна поддержка DDNS на вашем сервере/роутере. Смысл в том, что при смене адреса, роутер сообщает об этом DDNS серверу, а тот уже, соответственно, начинает возвращать на DNS запросы обновленный адрес. Обычно в роутерах поддержка DDNS есть, в линукс/винду надо ставить какой-то дополнительный софт, не знаю какой. Поддержка DDNS нужна именно на устройстве, которое подключается к провайдеру и на котором меняется внешний адрес, обычно это роутер.
  • Как зациклить выполнение команды в bat если процесс отпадает?

    @res2001
    Что значит "процесс отпадает"?
    Судя по коду у вас все зациклено навечно. Оно вам точно надо?
    Я бы запускал через шедулер, там и расписание можно настроить.
    На вид в коде ошибок нет. Если путь, указанный в cd существует, то будет запускаться скрипт. Питон должен быть доступен для запуска из командной строки (путь к питону должен быть указан в PATH) под пользователем из-под которого запускается батник. В шедулере по умолчанию задания запускаются из-под LocalSystem, настройки PATH у него могут не совпадать с настройками пользователя под которым работаете вы.
  • Имитация ООП в C, где ошибка?

    @res2001
    При вызове виртуальных функций через макрос надо указатель приводить к нужному типу функции, т.к. в vtable будут лежать не типизированные указатели (void*).
    Так что типы для каждой виртуальной функции должны быть определены с помощью typedef.
    Так как имена виртуальных функций реально будут у макросов, сами виртуальные функции должны называться как-то по другому, ну там подчеркивание добавлять или еще что.

    В общем кода получается слишком много, чтоб этим серьезно заниматься :-)
    Обычно хватает легкого приближения к стилю ООП, без этих наворотов с наследованием и т.п.
  • Имитация ООП в C, где ошибка?

    @res2001
    Wataru, Не согласен:
    1. vtable нужен только для виртуальных функций, для обычных, не виртуальных, она не используется. Автор, по моему, еще не дошел до реализации наследования и полиморфизма, так что явно не думал об этом.
    2. таблица виртуальных функций создается в единственном экземпляре, она одна для всех экземпляров класса. В структуре класса хранится только указатель на нее.
    Вызовы виртуальных функций можно завернуть в макросы с тем же именем, что я предложил в прошлом сообщении, в макросе вызывать нужный метод через vtable.
    Как-то так вижу.
  • Имитация ООП в C, где ошибка?

    @res2001
    Я бы предложил вообще не делать указатель на функцию внутри структуры.
    Просто именуйте функции по определенной схеме с указанием названия класса в имени функции, например: ClassName_FunctionName.
    В таком подходе есть преимущество - избавляемся от коссвенности при вызове функции, т.е. вызов будет происходить чуть быстрее, чем с использованием указателя на функцию.
    Но передавать указатель на объект в функцию все равно придется :)
    На хабре есть на тему ООП на Си несколько статей, одна из них: https://habr.com/ru/post/568588/
  • Ошибка при установке windows?

    @res2001
    L1nw0od, Согласен с John Smith, стоит начать с теста памяти.
    На моей практике самые не понятные ошибки при установке винды связаны со сбоящей памятью (еще из-за дохнущего БП могут проявлятся разные чудеса, но обычно это на стационарных ПК).
    Я пользовался диагностическим набором от adminpe.ru, там мемтест есть в загрузочном меню, инструкция по изготовлению загрузочной флешки присутствует в наборе.

    И берите образ винды с сайта микрософт, а не с левых источников.
  • Как подключить библиотеку в плюсах?

    @res2001
    Вам точно это надо на для cmake? Я тут не увидел ваших попыток сделать подключение библиотеки в cmake.
    По моему ваш проект, в который вы хотите подключить библиотеку, не cmake.
    У меня винда и mingw-make. Хотелось бы поменьше всяких дополнительных пакетов и зависимостей. И чтобы сорцы либы лежали рядом относительно main.cpp, с возможностью их правки.

    Ну и положите их рядом и включите исходники библиотеки в перечень исходников вашего проекта. Пусть она собирается вместе с вашим проектом. Это такой самый деревянный вариант.

    Я бы конечно, попытался использовать пакетный менеджер для установки библиотеки в систему (Linux, msys2, ...), если она есть в пакетах. Если в пакетах нет, то можно собирать и устанавить библиотеку в систему согласно описанию и подключаете в проект обычным образом: добавить путь к файлам заголовков библиотеки с помощью ключа компилятора -I, добавить путь к каталогу с динамической библиотекой с помощью ключа компилятора -L, добавить в линковку библиотеку с помощью ключа компилятора -l, использовать #include в своих исходниках для подключения заголовков библиотеки.
  • Кодирование IP-пакетов в звук?

    @res2001
    WSGlebKavash, Направленная антенна с усилителем и 4G модемом. Покупаете готовый комплект, вам останется только повесить повыше и направить в нужную сторону.
    Обычно на выходе вы получаете Ethernet, но можно найти вариант, чтоб сразу WiFi раздавал.
  • Ошибка git при push?

    @res2001
    Какой версией git пользуетесь?
    Я использую git, установленный в msys2 с помощью тамошнего пакетного менеджера pacman. Полет нормальный.
    Там же можно установить и много чего еще, от линуксовых утилит и различных библиотек до mingw и clang. В общем, рекомендую.
    Все что установлено в msys2 может быть доступно из винды, достаточно добавить в переменную окружения PATH пути к msys2.

    Так же в винде можно установить WSL, поставить туда любой линукс, установить там git из пакетов и использовать его оттуда, но это немного сложнее и разнообразные IDE и т.п. утилиты с GUI, скорее всего, не смогут его использовать.
  • Assignment operator VS Destructor + Placement new, где аргумент placement new - prvalue?

    @res2001
    три действия оформить в виде перегрузок шаблона функции со SFINAE

    Это, конечно, добавит читаемости коду :-)
  • Assignment operator VS Destructor + Placement new, где аргумент placement new - prvalue?

    @res2001
    floppa322, Не знаю, почему бы и нет.
    Но даже, если этого не произойдет, то в случае обычного оператора присваивания сам оператор должен будет перед присваиванием выполнить действия аналогичные действиям деструктора (да еще будет дополнительно вызван деструктор временного объекта), а в случае присваивания перемещением просто вызовется деструктор временного объекта (в этом случае будет лишнее перемещение данных оригинального объекта во временный).
    Все говорит за то что явный вызов деструктора и размещающего new проще для понимания и эффективней.

    placement new - это замаскированный вызов конструктора на заданном участке памяти.
    Т.е. если расписать содержимое placement new, то будет что-то вроде:
    (reinterpret_cast<T *>(buffer))->T(args);
    В С++ явный вызов конструктора (как метод класса) запрещен, но в MSVS такое когда-то прокатывало и можно было обходится без placement new, как сейчас - не знаю.
  • Assignment operator VS Destructor + Placement new, где аргумент placement new - prvalue?

    @res2001
    Не знаю, на счет "хорошоей практики".
    Компилятор наверняка тут включит свои оптимизации и получится примерно одно и то же в обоих вариантах.
    Но вариант с оператором присваивания накладывает на объект дополнительные ограничения - у объекта должен быть реализован оператор присваивания, а лучше чтоб был оператор присваивания перемещением.

    Лично мне больше нравится вариант с явным вызовом деструктора и размещающего new, именно по тому, что тут все явно. Явное всегда лучше не явного.
  • Зависает намертво или дико начинает тормозит Ubuntu 20.04, как лечить?

    @res2001
    Немного другая ситуация - после выхода из скринсейвера после продолжительного времени не активности начинает дико лагать вплоть до полного коматоза. Если скринсейвер включается на краткое время, то восстанавливается без проблем. Скринсейвер дефолтный - blank screen.
    Пока руки не доходят посмотреть в логах, что происходит, но методом тыка обнаружил, что виноват firefox.
    Если его закрываю перед блокировкой, то просыпается нормально.
  • Чему учит Марк Лутц?

    @res2001
    Луца читал в свое время. Толковый учебник по питону.
    На сколько помню, он там ничего не пишет про сетевое взаимодействие и не описывает соответствующих модулей. Так что может конкретно Луц и не поможет в написании сетевых игр.
    Для этого стоит читать других авторов, возможно, не связанных с питоном (сетевое программирование оно +- на всех языках одинаково). Как и по многим другим более специализированным темам.

    Возможно ТС уже перешагнул уровень учебника и стоит посоветовать что-то более углубленное.
    От себя могу посоветовать изучить следующие направления программирования: сетевое программирование, базы данных и SQL, параллельное программирование. Каждая из этих тем тянет на большую и толстую книгу, а то и не на одну. И это только начало :)

    На счет видеоуроков - можно начинать с видосиков, но после определенного уровня освоения темы станет практически не возможно найти более углубленное толковое видео. Видосики, как правило, закрывают начальный уровень вхождения, дальше либо узкоспециализированные книги, либо "родная" документация.
  • Как найти общие элементы у трех массивов?

    @res2001
    Я бы загнал первый массив в std::unordered_map, где ключ - это значение очередного элемента первого массива, а значение - счетчик. Для всех элементов первого массива, счетчик выставляем в 1.
    Дальше ищем каждое значение второго и третьего массива в mapе, если найдено - инкрементируем счетчик.
    Выводим все элементы из mapы, у которых счетчик равен 3.

    Стоит выбрать самый наименьший по размеру массив и его брать как первый.
  • Когда narrowing conversion Не является implementation defined?

    @res2001
    floppa322, Да, только убедится в этом вам нужно явно в коде.
  • Когда narrowing conversion Не является implementation defined?

    @res2001
    По моему, в приведенном примере это всегда зависит от реалиации, т.к. компилятор не генерирует проверяющий код.
    В приведенном примере длины типов равны, занчит будет просто побитовое копирование. Если бы длины типов были разные, то wide type обрезался до длины narrow type и то же самое побитовое копирование.
    Если включен высокий уровень предупреждений, то в этом месте компилятор ругнется.

    В приведенном примере, если значение uint32 >= 0x80000000, то в результате в int32 будет отрицательное число.
  • Как будет выглядеть данный псевдокод в коде на языке Си?

    @res2001
    mercower26,
    в Си не обязательны фигурные скобки в цикле

    Не обязательны. Но тогда в теле цикла будет выполнятся только 1 следующая после for операция, а у вас это flag=0;
    Это явно не то что нужно. flag должен обнулятся в начале каждой итерации первого цикла. В эту же итерацию должен входить и второй for, а он у вас сейчас не является вложенным в первый for (то что отступами второй for сдвинут относительно первого никакой роли не играет, в С/С++ отступы выполняют декоративную функцию, чисто для удобства разработчиков, компилятору на них наплевать).
    Вообще не стоит экономить на скобках и разметке - они делают код более понятным вам же (и тем кто читает ваш код).
    printf("Результат %d\n",X);
    Что вы хотите тут получить? Тут вы выводите адрес массива Х, а не содержимое. Печать элементов массива надо делать так как приведено в вашем же скриншоте выше.
  • Почему программа на СИ молчит?

    @res2001
    Логические операции то же судя по всему не проходили, или вы никогда в глаза не видел ASCII таблицу - всю эту портянку ifов можно заменить одним с условием
    if(a[i] >= '0' && a[i] <= '9') {
          num[i] = a[i];
          check = 1;
          continue;
     }


    w = atoi(num); на первой итерации num не инициализирован, в нем содержится мусор и этот мусор мы зачем то конвертируем в число. Вообще w используется только в блоке else, может быть туда и надо сунуть эту конструкцию?

    Вообще я бы пошел другим путем:
    1. В вашем цикле for:
    1.1. пропускаем не цифровые символы. Это делается просто вложенным циклом с проверкой и инкрементом счетчика. Все не цифровые символы сразу же копируем в итоговую строку. Если вам не нужна итоговая строка, можно просто каждый символ выводить сразу на экран.
    1.2. Найдя первую цифру, в следующем вложенном цикле "по цифрам" определяем максимальную цифру, для определения системы счисления. При проходе, не теряем индекс первой цифры, он понадобится в следующем пункте.
    1.3. Конвертируем число с помощью функции strtol, она поддерживает работу с разными системами счисления.
    1.4. Проверяем, что бы конвертированное число было меньше 256 (иначе число - это символ не из однобайтовой кодировки, а что-то из Unicode, а это вы тем более не проходили).
    1.4.1. Если число меньше 256, то записываем код числа как следующий символ в итоговую строку, или выводим на экран символ соответствующий коду.
    1.4.2. Если число >=256 - печатаем ошибку и завершаемся.
    1.5. переходим к следующей итерации основного цикла
    2. Выводим получившуюся выходную строку

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