Задать вопрос
  • Spoolsv.exe завершает работу. Имя сбойного модуля: wsnmp32.dll. Как найти что работает не правильно?

    @res2001
    Developer, ex-admin
    Спулер скорее всего падает из-за кривого драйвера принтера. Не однократно наблюдал такое. Сам по себе спулер обычно не является причиной ошибок.
    Так же может не падать, а, например, зависать, когда процесс спулера есть, но ничего не печатается.
    Стоит удалить сбойный драйвер принтера и спулер будет работать нормально.
    Сбойный драйвер можно обновить или наоборот взять предыдущую версию.
    Ответ написан
    3 комментария
  • Как правильно подключать модули одного уровня?

    @res2001
    Developer, ex-admin
    Модуль B использует данные из Модуля A

    Что за данные?

    смаке оперирует целями и зависимостями, а не данными.
    Зависимости можно указать с помощью add_dependencies, подключить библиотеку с помощью target_link_libraries.
    Если у вас в каком-то из модулей генерируются какие-то данные, то, видимо, там есть custom_target - укажите его в зависимостях вышележащего уровня.
    Ответ написан
    9 комментариев
  • Почему программа "Конвентер Валют" выдаёт 0.000000 при любом значении?

    @res2001
    Developer, ex-admin
    Ответ в комментариях
    Ответ написан
    Комментировать
  • Как оформить код?

    @res2001
    Developer, ex-admin
    Это же трехмерный "кубический" массив. Нет смысла делать такую сложную конструкцию.
    Делайте std::vector<int> values(size * size * size);
    Правда индексы придется вычислять ручками или можно оформить это в виде своего класса и переопределить операцию индексации.
    Выделять память одним большим куском для многомерных массивов - это правильно.
    Ответ написан
    Комментировать
  • Зачем указывать адрес?

    @res2001
    Developer, ex-admin
    При биндинге можно указать вместо адреса константу INADDR_ANY (0.0.0.0) - т.е. все доступные адреса, тогда программа будет слушать указанный порт на всех адресах, доступных ОС.
    Адрес 127.0.0.1 (или любой из подсети 127.0.0.0/8) назначают, обычно тогда, когда сервис должен работать только в рамках локальной машины. Например у вас есть обратный прокси на nginx и пара сайтов на apache. Прокси будет слушать внешний адрес на 443 порту, а сайты вполне могут слушать 127.0.0.1 и принимать подключения только от прокси.
    Ответ написан
    Комментировать
  • С чего начать изучения сетевого программирования?

    @res2001
    Developer, ex-admin
    Классика жанра - книга Стивенса "UNIX. Разработка сетевых приложений"
    Книга старая, по моему последнее издание 2007 года. В сети есть в электронном виде. Если повезет можно купить в букинистических магазинах.
    Хоть она и старая, но все описанное вполне живо и активно используется. Там примеры на Си. Но в шарпе и во всех других ЯПах принципы сетевого программирования одни и те же, т.к. используют для реализации обмена средства, предоставляемые ОС, а в книге описаны именно они.

    UPD: Если что, то под виндой все то же самое. Конечно, есть свои нюансы местами, но не критично.
    Ответ написан
    Комментировать
  • Как реализовать сетевую маршрутизацию между двумя OpenVPN серверами?

    @res2001
    Developer, ex-admin
    Соедините сервера между собой третьим ВПНом, в котором один из серверов будет сервером, второй клиентом.
    Адресация внутри этого ВПН должна быть уникальная.
    Добавьте соответствующие маршруты для пользователей.
    Ответ написан
  • Как написать правильно приложение на с++?

    @res2001
    Developer, ex-admin
    Что бы при переносе вашей программы на другой комп не терялись зависимости (библиотеки), нужно эти зависимости передавать вместе с программой явно - передавать необходимые dll файлы. Обычно для этого делают установочный пакет, куда входит все необходимое плюс скрипт установки, если требуются какие-то дополнительные действия, кроме копирования файлов.
    Другой вариант - использовать статическую компиляцию с библиотеками, тогда библиотека будет входить в состав вашего исполняемого файла. Размер исполняемого файла при этом будет заметно больше.

    В линуксе для динамических библиотек используется каталог (/lib; /usr/lib) отличный от каталога с исполняемыми файлами (/bin, /usr/bin), поэтому появляется возможность устанавливать библиотеки через пакеты пакетного менеджера универсально для всех программ, использующих данную библиотеку. В пакете программы просто указывается зависимости от пакетов используемых библиотек.
    В винде принято все зависимости программы устанавливать в каталог с исполняемым файлом программы. И тут нет какого-то общепринятого механизма делать как линуксе. Хотя никто не запрещает вам делать свой собственный софт с подобным механизмом, но сам механизм вы должны придумать и поддерживать самостоятельно в своем софте и кроме ваших программ никто больше использовать этот механизм не будет.

    В cmake есть еще вариант поиска пакетов с помощью pkg-config: https://cmake.org/cmake/help/latest/module/FindPkg...
    Ответ написан
    Комментировать
  • Как присвоить динамическому массиву типа void* значение в Си?

    @res2001
    Developer, ex-admin
    Нельзя выделить память для произвольного типа, т.к. размер произвольного типа - произвольный. Память всегда выделяется конкретного размера.

    В вашем примере вы выделяете память для двух указателей (void*). На всех распространенных платформах указатель, не важно на какой тип он ссылается, имеет один и тот же размер.
    Нельзя сделать разъименование void*, т.к. это указатель с неопределенным типом - компилятор не знает какого типа данные лежат по адресу в указателе, а следовательно не может с ними корректно работать. Для нормальной работы нужно привести указатель к какому-нибудь типу и потом уже можно делать разъименование (ваш 3 пример).

    Ваш пример не корректен для х64 платформы, т.к. sizeof(void*) там 8 байт, а sizeof(int) - 4 байта.
    Вы mallocом выделяете 16 байт памяти (2 указателя), а в 3 присваивании (которое работает) присваиваете значение 10 старшей половине первого указателя. В общем выглядит как бред.
    Для х32 - корректен, т.к. тут sizeof(void*) == sizeof(int)

    Для копирования двух массивов произвольного типа и размера, нужно знать размер массива в байтах (не в элементах). Можно не знать тип, но знать размер необходимо - иначе ничего не поучится. Выделяете память заданного размера, приводите указатель к char* и побайтово копируете (memcpy).
    Приводить к int* и копировать intы в этом случае нельзя, т.к. массив может быть, например 3 байта или 33, тогда при копировании через приведение к int* вы неминуемо выйдете за границу массива.
    Ответ написан
    Комментировать
  • Почему линкер возврашает ошибку при компиляции hello_world?

    @res2001
    Developer, ex-admin
    Использую msys2+mingw. msys2 предоставляет линукс окружение, командную строку и пакетный менеджер. Из командной строки msys2 все собирается без подобных плясок с бубном.
    В пакетном менеджере куча готовых библиотек и разного софта.
    Кроме mingw, можно использовать и clang, а так же и то и другое. Все ставится из пакетного менеджера.
    Если прописать пару путей в PATH и задать 1-2 дополнительных переменных окружения, то все будет доступно из cmd, а так же может быть использовано практически любыми IDE (qtcreator, eclipse, ...)
    Ответ написан
    Комментировать
  • Есть ли способ получать предупреждение при преобразовании char в int?

    @res2001
    Developer, ex-admin
    По стандарту sizeof(char) == 1, sizeof(int) >= 2.
    char->int и int->char - это 2 разных преобразования. Судя по вопросу для вас это одно и то же.
    Первое проходит без предупреждения, поскольку значимость не теряется. На второе компилятор ругнется, обычно это warning, опциями компилятора можно сделать чтоб был error.
    Повышение char до int не зависимо от того какой конкретно char в данной системе вполне стандартизовано и укладывается в стандартное расширение целочисленных типов.
    Обратное преобразование приведет к обрезанию значащих бит, это то же описано в стандарте.
    Ответ написан
    2 комментария
  • Где можно почитать/посмотреть о написании dll на c++?

    @res2001
    Developer, ex-admin
    WinAPI учить не надо - бессмысленное занятие - он достаточно большой и весь он вам вообще вряд ли когда-нибудь пригодится. Но надо знать где искать по нему информацию.
    По написанию DLL на С++ ... погуглите в конце концов. Там есть свои тонкие моменты, но это не сложно.
    Вот что нагуглилось сходу:
    https://learn.microsoft.com/ru-ru/cpp/build/walkth...
    Ответ написан
    Комментировать
  • Как написать функцию sin из библиотеки math.h в Си?

    @res2001
    Developer, ex-admin
    У вас sum2 не инициализируется в начале, а в цикле вы туда уже чего-то прибавляете.
    Как думаете какой результат будет возвращен функцией? Зависит от того что лежало на стеке где теперь лежит sum2, а лежать там может все что угодно.
    Ответ написан
    Комментировать
  • Как сделать one to many связь между таблицами?

    @res2001
    Developer, ex-admin
    Достаточно, чтоб в таблице "many" не было ограничений на уникальность для поля, по которому связываются таблицы.
    Ответ написан
    Комментировать
  • Как работает брандмауэр Windows?

    @res2001
    Developer, ex-admin
    Эти разрешения трансформируются в правила для входящих и исходящих пакетов. Именно эти правила заставляют фаервол совершать какие-то действия - пропускать или блокировать трафик.
    Можно настраивать эти разрешения программ, а можно непосредственно настраивать правила для входящих/исходящих пакетов.

    Принцип работы прост: каждый входящий или исходящий пакет проверяется по списку правил, в правилах заданы условия, если пакет проходит по условиям, то выполняется действие, которое назначено правилу (разрешить/блокировать).
    Для лучшего понимания работы вам лучше смотреть не в это окно, а в "Windows Defender Firewall with Advanced Security" - введите в поиске.
    Ответ написан
  • Какие есть надёжные способы замены ip (типа vpn)?

    @res2001
    Developer, ex-admin
    Самый надежный вариант - свой собственный ВПН.
    Арендуйте VPS в интересующей вас стране, придется найти способ оплачивать услугу, настройте свой собственный ВПН и ходите через него. OpenVPN Или WireGuard настраиваются достаточно просто.
    Ответ написан
  • Как исправить ошибку в программе на С++, чтобы не вызывалось необработанное исключение или кнопка останова?

    @res2001
    Developer, ex-admin
    1. у вас в конструкторе выделяется динамическая память. Но деструктора у вас нет. Память не освобождается, после удаления объекта - утечка.
    2. Еще про конструктор. Внимательно посмотрите на строчку: coord = new double[size];.
    Чему равно значение переменной size в ней? Какого размера выделится буфер?
    3. Конструктор копирования реализован не правильно. Если вы создадите объект с его использованием, то он будет использовать тот же блок динамической памяти, что и исходный объект. Ни к чему хорошему это не приведет, вряд ли вы рассчитывали на такое поведение.

    На счет ошибки компилятора - хорошо бы увидеть текст ошибки. Условие в operator<< действительно всегда ложно. Надо сравнивать с vec.size - 1
    Ответ написан
    Комментировать
  • Почему tellg() неявно приводится к int при инициализации int, но не может быть сложенным с int?

    @res2001
    Developer, ex-admin
    попробуйте так: 2 + telg() На gcc вроде прокатывает без предупреждений.
    Но это опасно, т.к. tellg может вернуть ошибку (-1) и она в этом случае останется а) необработанной б) ваш код не поймет, что была ошибка - выражение вернет корректное положительное не правильное значение. Возможно именно по этому выдается предупреждение (в GCC предупреждение, а не ошибка).
    Ответ написан
    Комментировать
  • Как правильно написать функцию принимающую универсальную ссылку?

    @res2001
    Developer, ex-admin
    ifs может быть const

    Поток не может быть const. Когда вы читаете/пишете в поток у него меняются внутренние атрибуты. В const потоке вы ничего не сможете изменить, а следовательно ни писать туда ни читать из него не сможете - зачем он такой красивый нужен?
    как я понял нужно использовать и std::forward, но не понимаю куда его вписать корректно

    Если вы будете поток дальше передавать в какие-то функции, то заверните поток в forward. То же самое, если надумаете возвращать поток из функции.
    Ответ написан
  • Error LNK2019: ссылка на неразрешенный внешний символ public: void __cdecl Window::create(void)?

    @res2001
    Developer, ex-admin
    но window.cpp задумывается как часть библиотеки которую можно потом установить

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