• Как реализовать взаимодействие нескольких библиотек между собой на c++?

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

    Можно гуглить "имя функции example" и тогда вы найдете в интеренете готовый код, работающий с этими функциями.
    Ответ написан
    Комментировать
  • Как убедиться что атомарные операции будут выполнены точно правильно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В данном исходнике нет проблемы атомиков. Но здесь есть проблема отсутсвия синхронизации потоков а и b.
    Нужно наладить синхронизацию и дальше атомики станут приносить ощутимую пользу.
    Ответ написан
    Комментировать
  • Как убедиться что атомарные операции будут выполнены точно правильно?

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

    В стандартной библиотеке самое близкое к этом - std::condition_variable.

    Платформо зависимое решение может быть эффективнее. Какие-нибудь WaitForSingleObject/CreateEvent в винде, например.
    Ответ написан
    Комментировать
  • Как работает маршрутизация с двумя шлюзами по умолчанию?

    mikes
    @mikes
    Ответ на ваш вопрос - source routing
    Сервер отвечает с того интерфейса на который пришел первый пакет.

    а вот если вы будете кого нить пинговать к примеру, то все (окромя 10.10.118.0/24) будет уходить через 10.10.118.1 поскольку он является шлюзом по умолчанию.
    Ответ написан
    1 комментарий
  • Как используются "магические константы" в реальных реализациях?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ты должен спрашивать какие алгоритмы игровой графики бывают. Это важное. А константа - это просто реализация.

    Почитай Генри Уоррена - Алгоритмические трюки для программистов. Там есть всякое. Деление через умножение на магию. Умножение через сдвиги. Дискретные логарифмы и корни и прочее.
    Ответ написан
    Комментировать
  • Программа не работает так, как должна (ошибки в логике, которые не могу найти)?

    vabka
    @vabka
    Токсичный шарпист
    Ты не сказал, как именно ошибка проявляется, так что сложно сказать.

    ошибки в логике, которые не могу найти

    Для этого:
    1. Рефактори код, чтобы с ним легче было работать.
    2. Покрывай код автотестами
    3. Тестируй нормально, а не наобум, чтобы понятно было, как проявляется ошибка, какое поведение ты ожидал от программы, а какое фактически произошло.
    Ответ написан
    5 комментариев
  • Защита переменных?

    includedlibrary
    @includedlibrary
    Не станет. Обозначения protected/private нужны только для того, чтобы компилятор не давал программмисту, использующему ваш класс, менять значения переменных
    Ответ написан
    5 комментариев
  • Не знаете как можно исправить ошибки на с++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам надо описать конструктор Ball без параметров. Например:
    Ball() x(0), y(0), r(0), vx(0), vy(0) {}

    Потому что new Ball[n] Создает n объектов, но конструктора по умолчанию (без параметров) у класса Ball нет. Обычно его генерирует компилятор сам, но только если вы не указали никаких своих конструкторов. А new не знает, какие числа передавать в качестве x, y, r и т.д.

    Смотрите правило трех.
    Ответ написан
    Комментировать
  • Стоит ли идти в Embedded разработку?

    @dima20155
    you don't choose c++. It chooses you
    Диагонально прочитал статью и хочу сказать, что с частью пунктов соглашусь, но, не абсолюнто со всем.
    Прежде всего задайте себе вопрос а чего вы хотите? Что вам интересно?
    Действительно написание ПО под MCU требует понимание (в основном, цифровой) электроники. Например, классические цифровые интерфейсы передачи данных (UART, I2C, SPI) это прямой мостик между знаниями software и hardware и хороший embedder должен понимать как эти протоколы работают и куда ткнуть осцилограф/логический анализатор, чтобы понять что не так.

    Помимо описанного выше есть более hardcore уровень - программирование под embedded Linux. В ситуации, когда вам не хватает ресурсов MCU для, например, проигрывания высококачественного звука, считывания изображений с камер, а также все ещё нужно управлять сигналами на плате напрямую, то ваш выбор это embedded Linux и так далее. Тут опять же много чистого С.

    Есть и третья известная мне сфера для embedded разработчиков (которая также не лишена славы). Компании, занимающиеся разработкой CPU, MCU и иных цифровых/цифроаналоговых микросхем. Да, вам покажется, что это только про Intel, AMD, Samsung, Huawei. Но даже в РФ минимум с пол десятка компаний, которые занимаются подобными разработками и активно нанимают людей. Все это довольно сложные и, в то же время, интересные темы.

    Как вы догадываетесь, для каждого из трех пунктов нужны немного разные знания (хотя базовое образование, в основном, требуется одно и тоже). Также для 2 и 3 пункта ваше физическое присуствие на рабочем месте, вряд ли, потребуется, ровно как и лезть руками что-то паять (просто потому что руками в этих областях уже никто не паяет). Обычно, для embedded из 1 абзаца, требуется больше работы с железом, но и тут есть вариации.

    P.S. Лично мне несколько наскучило копаться с железками (а их проектирование - это моя магистерская работа)) и отлаживать низкоуровневые интерфейсы и код, поэтому я и сам немного свернул с этой embedded дорожки, но я занимался только тем, что описано в 1 пункте и совсем немного из 2 (к слову оба успел поработать и оффлайн и онлайн). Найти работу с моим опытом не было особо сложно, так что embedded не приговор: разонравилось вполне сможете перейти в С++/Rust было бы желание.
    P.S.S. Извиняюсь, что получилось немного скомкано, спрашивайте, могу рассказать про свой опыт подробнее.
    Ответ написан
    4 комментария
  • Как получить список пользователей которые входили на компьютер?

    @MaxKozlov Куратор тега PowerShell
    Парсить Security Event Log на соответствующем компе

    event-4648
    event-4647

    event-4624
    event-4634

    типа
    [DateTime]$StartDate = '2023-05-11'
    [DateTime]$EndDate = '2023-05-12'
    $ComputerName= 'targetcomputer'
    
    $params = @{
      ComputerName=$ComputerName
    	FilterXml = '<QueryList>
    	  <Query Id="0" Path="Security">
            <Select Path="Security">*[System[(EventID=4647 or EventID=4648) and
            TimeCreated[@SystemTime&gt;='''+
            $StartDate.ToUniversalTime().ToString('u').Replace(' ','T') + ''' and 
            @SystemTime&lt;'''+
            $EndDate.ToUniversalTime().ToString('u').Replace(' ','T')+ ''']]]
            </Select>
    	  </Query>
    	</QueryList>'
    }
    $e = Get-WinEvent @params
    
    # Ну и тут потом анализировать $e
    Ответ написан
    3 комментария
  • Завершается программа на Си из-за одной строчки кода. Что делать?

    sprintf(_playingField[16], "##################################");

    В этой строчке выход за границы массива. Массив на 16 элементов, а индексация начинается с 0. Следовательно, последний индекс равен 15.
    Ответ написан
    1 комментарий
  • Как обращаться к динамическому массиву, инициализированному в классе?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Figure** figure_colletion = new Figure * [this->collection_size];


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

    Поэтому любой уважающий себя стиль форматирования кода подразумевает, что члены класса должны быть приватными и как-то по особому именоваться (например, заканчиваться на "_", или начинаться с "p") тогда бы вы этой ошибки не совершили. Еще можно включить предупреждения при компиляции.

    И еще, писать в методах this-> перед каждым обращением к члену класса не обязательно.
    Ответ написан
    1 комментарий
  • Нужно ли переносить центр с L3 на маршрутизатор?

    @SunTechnik
    Зависит от того, какие роли вы планируете возложить на pfSense.
    Если планруется, что он будет иметь доступ ко всем vlan и рулить доступом между vlan - то, возможно, придется перенести.
    Если же pfSense отвечает тоолько за выход в internet или vpn, то пусть Aruba остается в своей роли. Надо только на ней default (или необходимые) маршруты добавить..
    Ответ написан
    Комментировать
  • Почему не срабатывает команда shutdown /l /f /t 10?

    vabka
    @vabka
    Токсичный шарпист
    Раз справка открывается - значит кому-то это явно нужно (прочитать. внимательно. тебе.)

    1. /l нельзя использовать одновременно с /t
    2. /f не нужен, если используешь /t

    Об этом написано в справке:
    https://learn.microsoft.com/en-us/windows-server/a...
    Ответ написан
    2 комментария
  • Как собрать приложение на языке программирования C++, используя CMake?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как мне организовать систему сборки, чтобы любой пользователь мог запустить приложения, имея .exe файл и папку data ( aka DATA_DIR )

    Для этого нужно научить приложение находить папку data. Сейчас ты, похоже, используешь полный путь из DATA_DIR. Возможно ты хочешь искать data относительно положения исполняемого файла. Это должно быть в логике приложения, я не вижу, как тебе может помочь система сборки, если пользователи не будут пересобирать приложение.
    Ответ написан
    4 комментария
  • Как связать локальный проект с другим репозиторием на GitHub?

    williamK
    @williamK
    programmer
    1. переименовать директорию проекта на локальном диске
    2. с гитхаба склонировать проект на локальный диск
    3. скопировать с заменой свои файлы в полученный репозиторий.
    4. сделать коммит и пушить не гитхаб
    Ответ написан
    4 комментария
  • Как исправить ошибку LNK2001 unresolved external symbol __imp_GetUserNameW C++?

    TrueBers
    @TrueBers
    Гуглю за еду
    Гуглим название функции: GetUserNameW.
    Заходим по первой же ссылке на документацию Microsoft.
    Там спускаемся в раздел Requirements.
    В строке "Library" видим Advapi32.lib.

    Теперь гуглим текст ошибки LNK2001 unresolved external symbol и переходим по первой ссылке, которая снова, внезапно, по невероятному стечению обстоятельств оказывается документацией Microsoft.
    Там читаем описание ошибки, и что нужно сделать, чтобы её устранить. Там даже ссылка на StackOverflow оставлена!

    2 основных варианта: либо в настройках проекта добавляем эту библиотеку к списку линкуемых, либо прямо в коде говорим линкеру #pragma comment(lib, "Advapi32").
    Браво! Вы великолепны!
    Да ещё и потратили в 3 раза меньше времени, чем писать сюда вопрос.

    Не сложно, если захотеть, правда?
    Ответ написан
    Комментировать
  • Как в языке СИ проверить существует ли файл без создания нового?

    mayton2019
    @mayton2019
    Bigdata Engineer
    FILE *handle = fopen("filename", "r")
    возвращает файловый указатель. Если открываешь на чтение - то он обычно null если файла
    не было или была какая-то другая ошибка. Детали по ошибке выдает другой системный вызов errno, streeror или
    что там еще есть другое не помню точно.
    Ответ написан
    Комментировать
  • Уменьшается ли используемая память программы?

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

    Но вообще, делать так для экономии памяти никогда, категорически не рекомендуется. Код становится менее читаем а экономите вы на спичках. Это локальные переменные - они на стеке. Их много можно выделить только рекурсией или большими массивами (ну не объявите вы в коде миллион локальных переменных). В обоих случаях, если стека не хватает - надо или избавлятся от рекурсии/больших массивов изменением логики, или выносить их в кучу.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    понял что у меня каша в голове

    Эт точно...

    Достаточно неплохое определение бродкастового домена Вы можете найти в Вики:

    Широковеща́тельный доме́н (сегме́нт) (англ. broadcast domain) — группа доменов коллизий, соединенных с помощью устройств второго уровня. Иными словами логический участок компьютерной сети, в котором все узлы могут передавать данные друг другу с помощью широковещания на канальном уровне сетевой модели OSI.

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

    Но даже если ограничиваться только бродкастом подсети. Вот некий узел шлёт бродкаст. Он формирует пакет. Поскольку адрес назначения не является определённым узлом, то в пакете не указывается МАС-адрес. Пакет пошёл в сеть... И любой коммутатор, не имея этого неуказанного MAC в FDB-таблице, направит пакет на все интерфейсы, достижимые из порта источника в соответствии с его VLANID и иными настройками. Поскольку пакет идёт на L2, никаких подсетей тут нет, а потому никакое Ваше деление на подсети на распространение не влияет в принципе.

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

    Ну и касательно деления вообще. VLAN поделили сеть на 2 уровне. С этого момента рассматривайте ту часть сети, которая объединяется одним VLANID, как полностью отдельную и изолированную от всех остальных сеть. Просто представьте, что коммутатор разделился на несколько маленьких, и к этому каждому маленькому подключен только один VLANID. Вот теперь в этой виртуально отделённой сети уже вводите следующий уровень деления - на подсети.

    Да, смысл деления на подсети даже внутри одного VLANID - имеется. Но если Вы его не видите, значит. Вам в данный момент такое деление не нужно, и можете исповедовать принцип "в каждом вилане своя подсеть".
    Ответ написан
    3 комментария