• Почему вылетает исключение при удалении объекта?

    @res2001
    Dyikot,
    если не использовать интерфейс то ошибки нету

    Ну да, точно! Вы нашли ошибку.
    У вас же указатель приводится к типу интерфейса, а указатель на интерфейс не обязан совпадать по значению с указателем на реальный объект.
    Удаляйте items не внутри UseContainer, а там же где его создаете. При выделении памяти сохраняйте оригинальный указатель (на объект, а не на интерфейс) и его используйте в delete.
    Или смотрите ответ maaGames
  • Как через cmd закрыть процесс по названию загловка в win 2019?

    @res2001
    metalexs, taskkill вполне рабочий вариант. Но фиг знает как там фильтровать по WINDOWTITLE, состоящему из нескольких слов и т.п.

    Но можно делать по другому, фильтровать в tasklist по IMAGENAME (название исполняемого файла) с ключом /v (будет выводить и WINDOWTITLE), а затем в конвеере навешивать фильтр с помощью findstr:
    tasklist /FO table /V /FI "IMAGENAME eq prog.exe" | findstr "Window title"

    Всю эту конструкцию завернуть в цикл for /f, чтоб вытащить PID процесса и уже по PIDу убивать процесс с помощью taskkill.
  • Почему вылетает исключение при удалении объекта?

    @res2001
    Dyikot, Похоже на то, что у вас где-то выход за пределы выделенной памяти, что вызывает изменение указателя items на стеке. Сам код UseContainer выглядит вполне безобидным в этом плане, так что ошибка где-то глубже, внутри вызовов, используемых в UseContainer.

    Запустите под отладчиком, поставьте точку останова в начале UseContainer и выполняйте по шагам, не заходя в глубину. После каждого шага, контролируйте значение items. Когда оно изменится - значит выход за пределы был в предыдущем вызове.
    Следующий этап - ставите точку останова внутри "предыдущего" вызова и все повторяете снова.
    Возможно так придется делать несколько раз, с каждым шагом погружаясь глубже по стеку вызовов.
    В итоге найдете участок кода, где происходит выход за пределы памяти, устраняете ошибку. Профит.

    PS: Друзья - это зло, попытайтесь избавится от использования функций и классов друзей. В вашем случае это не нужно.
  • Вызов функции, экспортируемой из EXE. Как это сделать нормально?

    @res2001
    hard2018, RPC - это лишь обобщающее название технологии. Подходов и реализаций RPC много. Так что вы не можете просто "вызвать" через RPC, нужно выбрать конкретный механизм RPC, поддерживаемый ОС или сторонними библиотеками и его использовать в своем приложении. Кроме того в RPC 2 стороны взаимодействия и обе стороны должны явно использовать механизм RPC.
    Тот же COM имеет в своем составе DCOM, который является RPC механизмом.
    Можно на сокетах сделать свой собственный RPC.
    Этим список не ограничивается.
    https://ru.wikipedia.org/wiki/%D0%A3%D0%B4%D0%B0%D...
    https://learn.microsoft.com/en-us/windows/win32/Rp...

    RPC подразумевает передачу данных по сети. IPC - то же самое, но в рамках одного компьютера без выхода в сеть.
  • Вызов функции, экспортируемой из EXE. Как это сделать нормально?

    @res2001
    У вас это реализовано или нет? Что за модуль?

    Функции экспортируемые из EXE можно вызывать только в DLL, используемым этим EXE. Например, EXE грузит плагины, содержащиеся в DLL, и плагины могут вызывать какие-то функции API, предоставляемые самим EXE. Другие процессы не могут вызывать такие функции.

    Другой вариант: для передачи выводимых в консоль данных используете любой удобный механизм IPC, начиная файлов или именованных каналов до создания COM объекта.
  • Почему strcat перезаписывает переменные?

    @res2001
    Andrei1penguin1, Так же.
    Но этого не достаточно. Нужно каждый раз контролировать, чтоб буфер не переполнился.

    В той форме, что вы используете scanf нет контроля буфера за переполнением (функция не знает размер буфера). Можно использовать модификатор длины scanf("%100s", str)
    Но лучше использовать форму: scanf_s("%s", str, sizeof(str));
    scanf возвращает количество считанных (и записанных по указанному адресу) байт.
    Для справки: https://en.cppreference.com/w/c/io/fscanf
    С strcat можно контролировать переполнение "вручную" или использовать более защищенный вариант: strcat_s. https://en.cppreference.com/w/c/string/byte/strcat

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

    Рекомендую использовать буфер не в 100 символов, а скажем в 1024 или еще больше.

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

    Вот это
    strcpy(&word, "");
    Можно заменить на word[0] = 0; с тем же результатом, в случае, когда у вас word будет массивом символов.

    В качестве оптимизации. Гораздо быстрее читать не по одному символу, а сразу в большой отдельный буфер и затем парсить этот буфер посимвольно. Код, конечно, усложнится, но работать будет быстрее. Стоит этим заниматься только если производительность для вас критична и только после того, как отладите "базовый" алгоритм.
  • Терминальный доступ к windows серверу без RDP - какими программами можно реализовать?

    @res2001
    kolabaister,
    Поверьте на слово

    В наше время даже английским джентльменам на слово не верят.

    Такого же качества продукт, как RDP, есть только у Citrix (у Citrix даже может быть и лучше), все остальное - жалкое поделье для других задач. Но Citrix не раздает его бесплатно.

    Что с ВПН совсем ни как? Можно ВПН пустить и по TCP и по стандартным портам (443).
    ssh работает? Можно через промежуточный ssh сервер настроить перенаправление портов через ssh. Будет такой себе ssh ВПН для одного порта.
    Или завернуть трафик в SSL тунель.
  • Почему не подключается OpenVPN?

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

    Тут больше интересно, что в логах у клиента, и хотелось бы увидеть чуть больше клиентского лога.
    Видимо, все таки трафик где-то блокируется. Проверяйте еще раз фаерволы. Попробуйте выключить все доступные вам фаерволы на пути следования пакетов. Можно попробовать сменить порт ВПН на какой-нибудь стандартный TCP (tcp/443 например).
  • Как узнать размер незаполненного массива в c++?

    @res2001
    Dmitrii, Мой пост больше для автора вопроса, на подумать. Он ищет универсальных решений и ему тут рады предлагать. Но реальность такая как я ее описал.

    strlen и "сырые" строки работают по принципу описанному во втором абзаце моего поста. Все функции работающие с сырыми строками знают, что внутри строки не может быть нулевого символа - это гарантируется алгоритмически.
    В некоторых случаях алгоритмически принимаемые значения никогда не используют какие-то биты. Эти биты можно использовать как признак отсутствия значения. Опять же - это вариант из второго абзаца.

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

    Большинство из предложенных вариантов может быть сведено к двум вышеперечисленным.

    Остальные представляют собой вариант с хранением для каждого элемента массива булевого флага, обозначающего используется элемент или нет. Флаг может хранится вместе с элементом (в структуре) или отдельно в виде массива или битового поля. Но это уже не будет "чистый" массив базового типа.
  • Как узнать размер незаполненного массива в c++?

    @res2001
    А почему INT_MAX, а не INT_MIN, например, или любое другое значение?
    Во встроенных стандртных типах данных нет значений обозначающих "отсутствие значения". Любые значения являются "нормальными" для типа. Даже когда вы объявляете переменную без инициализации, она будет иметь какое-то значение, да это значение мусорное или случайное, но оно вполне "нормальное". Даже если рассмотреть float или double - там есть значения NaN и Inf, но и эти значения "нормальные" - они могут появляться в ходе обычных арифметических вычислений и их нельзя интерпретировать как "отсутствие значения".

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

    Наиболее универсальный вариант - хранить отдельно размер массива и количество заполненных элементов. Например, так происходит в std::vector, и думаю что в std::string примерно так же.
    Но это работает только для случая, когда все не используемые элементы лежать в конце массива. Этот подход не подойдет, когда не используемые элементы могут быть в произвольной позиции.
  • Как максимально очистить диск C?

    @res2001
    Krenicc, Кстати, стандартный виндовый менеджер очистки дисков очень не плохо справляется со своей работой. Рекомендую к использованию.
  • Как максимально очистить диск C?

    @res2001
    Krenicc,
    Это нормально устанавливать программы на другой диск

    Это, конечно, нормально. И никто не запрещает. Но в реальности это нафиг не нужно. После того как винда загрузилась самой винде от диска уже надо не много и установленные на него программы никак ей не помешают.
    К играм это не относится - они слишком много весят и действительно их лучше ставить на другой диск.

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

    Для примера. У меня Вин11 профили пользователей целиком перенесены на другой диск, но винда, месяца 3 назад установленная, уже отъела больше 100Гб. Пока не парюсь - места хватает.

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

    @res2001
    Vilfredo KKK, https://en.cppreference.com/w/c/string/byte/strncpy
    По size_t: смотрите по ошибкам на какую переменную ругается компилятор, меняете ей тип на предложенный компилятором, компилируете, опять смотрите ошибки и т.д. пока ошибки не исчезнут.

    Надо иметь ввиду, что когда вы выполняете какие-то операции с разными типами (арифметика, сравнения, присваивания, ...), то компилятор приводит операнды к какому-то одному типу, а затем выполняет действие. Процессор не может выполнять операции с разными типами. Правила приведения типов описаны в стандарте языка.
    При автоматическом приведении типов могут возникнуть ситуации, когда компилятор должен приводить более широкий тип к менее широкому, а это неизбежно приводит к потере данных, как в вашем случае (size_t->int). Поэтому компилятор выдает ошибку, заставляя программиста дополнительно подумать над этим местом в программе. Как правило, компилятор прав в своих сообщениях и стоит к ним прислушиваться, хотя бывают и исключения.
  • Как сменить раскладку на английскую по умолчанию в Windows 11?

    @res2001
    Похоже на то, что вы вместе с указанной настройкой еще поменяли и "Язык интерфейса Windows" чуть выше на первом скрине.
  • Как определить занятость l2tp или ikev2 кем то?

    @res2001
    WebAirStudio,
    Только в моем случае VPN нужен, чтобы обойти NAT провайдеров пользователей. Нужно открыть определенный порт. Этот порт на 1 сервере только 1. Соответственно 1 сервер может использовать только 1 пользователь. Потому что если на входящий порт придет пакет, кому из 2 пользователей он предназначается?

    На сколько понял ВПН сервер у вас будет на Ubuntu в единственном числе. Все остальное - ВПН клиенты. Для ВПН клиентов абсолютно без разницы какой они используют порт, важен порт на ВПН сервере. На ВПН сервер к одному порту может подключится много ВПН клиентов с произвольных портов. ВПН сервер сам знает какому клиенту предназначается какой трафик и маршрутизирует его (то же самое делает и стек TCP/IP без ВПН).
    На одном компьютере может быть настроено и одновременно активно несколько клиентских ВПН сессий одного типа и они даже не будут друг другу мешать при правильной конфигурации.
  • Как думаете, с чем связана ошибка и как ее исправить?

    @res2001
    Vilfredo KKK, Я же не писал "везде". Там где это оправдано/нужно/логично.
    Например str_len явно просится в size_t.
    Ошибки компилятора могут указывать на потенциальные места, где, возможно, требуется использование size_t, Но это по любому ваше решение, а не мое и не компилятора.
    Учтите, что это потянет за собой и другие изменения. Например выражение i <= str_len начнет сравнивать знаковый тип с беззнаковым, что так же вызовет преобразование типов и скорее всего компилятор начнет ругаться тут, может и еще где-то. Так что i то же просится в size_t и т.п.
    Вариант с cast можно обезопасить явными проверками, что значение в size_t влазит в int и только после этого делать cast.
  • Как получить результат из exec с русскими символами?

    @res2001
    Artem Mamaev, Особой роли не играет. По умолчанию в винде в консоли стоит кодировка cp866 - старая досовская кодировка, даже в Вин11.
    Так что нужно перекодировать в нужную вам кодировку. Как это сделать на пыхе не скажу.
    Консольная команда chcp может показывать или менять текущую кодировку. Но эта команда работает только в cmd.exe и ее изменения действуют только на текущую консоль. В вашем случае консоль запускается, видимо, в скрытом режиме и не факт, что exec запускает cmd.exe.
  • Почему типы из заголовка cstdint доступны без его включения?

    @res2001
    Ни то ни другое.
    Возможно, этот заголовок подключается где-то внутри других заголовочных файлов.
    Этот файл у вас не единственное включение в вашей программе?
  • Проблема автозапуска exe файла?

    @res2001
    Каталог по умолчанию может, конечно, зависеть от способа автозапуска. Но скорее всего он будет c:\windows\system32. Так что без прав администратора туда ничего записать не получится (да оно и не нужно).
  • Как удалить папку по шаблону в консоле windows?

    @res2001
    JaFFFar, Ок. Значит не умеет в маску. Проверил, у меня есть rmdir в составе msys2, похоже это она умеет удалять по маске, но это не стандартная утилита. Можете найти любую другую с тем же функционалом. Не тащить же msys2 ради одной утилиты. Хотя с другой стороны, там в составе весь набор линуксовых утилит и много другое.
    Но если вам нужна работа "из коробки", то лучше использовать стандартный вариант.