Задать вопрос
  • Как перевести программу c++ в ехе и что бы запускал ось на любом компьютере с Windows?

    @rPman
    Вопрос очень на самом деле сложный.

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

    Зачастую, если пользуешься какой-нибудь средой разработки (IDE, например Microsoft Visual Studio) то за сборку exe файла и всего проекта будет отвечать она, а пользователю в мышевозекательном интерфейсе дается возможность настроить все необходимое.

    Например создавая проект "Консольное приложение c++" (название приблизительное, не помню точно уже) проект будет автоматически настроен на сборку консольного приложения, лишних библиотек не подключено и т.п. Мало того, возможно понадобится собрать приложение сразу для нескольких архитектур (x86 и x86_64 например), т.е. по набору exe/dll на каждую архитектуру, и бывают случаи когда даже файлы баз данных не переносимы и потребуют свои для каждой.

    После сборки всех необходимых exe и dll (есть есть) нужна программа установщик, созданная из твоего приложения, в которую будут собраны все необходимые файлы, exe, dll и стартовые настройки... обычно эта программа представляет из себя один файл архив в особом формате.

    В самых простых случаях, когда на целевой машине даже не надо создавать ярлык (просто распаковать и все), можно воспользоваться каким-нибудь self extracted archive (у winrar такая опция есть). Иногда инструменты для создания такого пакета есть в самой IDE (точно помню у visual studio для managed .net кода такое было), а иногда это стороннее приложение, для windows рекомендую попробовать inno setup, позволяет создавать не только exe установщик но и msi (специализированный формат windows для установочных архивов), это приложение позволяет описывать процесс установки в виде некоторого языка, не заморачиваясь с интерфейсом.

    p.s. windows нет прямого ограничения по запуску приложений без установки, т.е. просто копируй вручную exe файл и все

    upd. для с++ добавляется еще один челедж, решить, каким компилятором собирать, какими стандартами (стандарт реализация эксепшен try/catch/throw, формат имен подключаемых dll и т.п.), какими базовыми библиотеками (например какая будет использоваться libc) и даже для какой версии ОС собираешь (например собрав под последнюю win10 приложение может не запуститься на win7 или winxp, потому что будет требовать несовместимую версию visual studio redistributable (vcredist*.exe этот пакет обновлений таскают с собой все кому не лень, и кстати по лицензии делать это без разрешения майкрософт низязя)

    Так уж исторически сложилось, что нормально тулчейн найти под windows можно либо:
    * gcc (gnu c compiler) - задает всем остальным, тут полнее реализуют новые стандарты, работает во всех ОС, но при этом есть windows сборка (смотреть у mingw кстати она есть по до все ос, позволяет кросскомпиляцию типа из linux собрать windows exe) а есть cygwin (несовместимая ни с чем, но качественно повторяет linux стандарты)
    Поговаривают что mingw все, кончился :(
    * microsoft visual c++ compiler (идет с visual studio), пытается задавать свои ни с чем не совместимые стандарты, корежит существующие, с целью создать хаос и привязать разработчиков только к windows
    и это у майкрософт получается, к сожалению
    * llvm и clang (это отдельные проекты но когда говорят об одном то и о другом), стандарт стоит особняком, так как llvm это некая виртуальная машина, с очень эффективной реализацией, с jit и оптимизациями
    настроить на windows это еще надо уметь, но есть возможность прописать для использовании в visual studio!
    Ответ написан
    Комментировать
  • Как скомпилировать .so файл в .c?

    CityCat4
    @CityCat4 Куратор тега C
    Дома с переломом ноги
    Я нашол .so файл и мне нужно скомпилировать в .c

    Чаво сделать-та? Эт типа "я нашел полкило фарша и мне надо получить обратно мясо, из которого он сделан"? Операция, обратная компиляции (а компиляция, чувак - это получение из исходного кода исполняемого модуля) - называется - внезапно - декомпиляцией. И она для .c файлов возможна в очень примитивной форме только в том случае, если в модуле "забыли" отладочную информацию. Во всех других случаях она попросту невозможна :D
    Ответ написан
    Комментировать
  • Как работает GetAsyncKeyState()?

    profesor08
    @profesor08
    https://docs.microsoft.com/en-us/windows/win32/api...
    проверяет состояние кнопки (нажата или нет) в момент вызова самой функции, в самом низу есть пример и еще ниже требования
    Ответ написан
    Комментировать
  • Как работает GetAsyncKeyState()?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Ну есть же подробная документация, там всё расписано.
    Ответ написан
    Комментировать
  • Как убрать мусор из char массива?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Что у вас за операция пересечения?

    Первая проблема - вы берете максимальную длину двух строк в size и потом проходитесь циклом до size по обеим строкам. Но ведь более короткой строки там просто нет - вы обращаетесь к не вашей памяти.

    Вам надо проверять, есть ли обе строки по индексу i, прежде чем сравнивать их.

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

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

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

    Чтобы дополнить число нулями до заданной ширины при выводе воспользуйтесь setw и setfill:
    std::cout << std::setfill('0') << std::setw(4) << i1 << endl;
    Ответ написан
    Комментировать
  • Как завершить ввод строки без нажатия enter?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Программа должна считывать отдельные нажатия, а не ввод строки целиком.

    Каждый раз после нажатия ввод (строка) должен формироваться из ранее нажатых клавиш. Пока он не валидный - продолжать ожидать следующие нажатия. Как только ввод стал валидным - принять его.

    Такое обычно практикуют при вводе подтверждающего кода из смс. Как только ввёл нужное количество цифр и/или правильный код, принять его.
    Ответ написан
    Комментировать
  • Как перевести код в ООП c++?

    nazares
    @nazares
    Software Engineer
    Ответ написан
    Комментировать
  • Как решить эту ошибку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Перепишите этот ужас с нуля. Там невозможно найти ошибку.

    Советую воспользоваться тем, что условные операторы вычисляются лениво: Если написать A && B и A окажется false, то B даже не будет вычисляться.

    Так, проверка на клетку сверху может быть написана так:
    if (i > 0 && a[i-1][j] - мина)

    Так вся ваша простыня выродится в 8 последовательных проверок. Если меняются обе координаты, то надо через && объединить 3 условия - 2 на проверку невыхода за границы массива, и последнее - проверка значения массива.

    Еще можно завести массив на SIZE+2 x SIZE+2 и заполнять его с (1, 1). Фактически, создается каемка вокруг исходного массива. И пробегаться по нему надо от 1 до SIZE. Так, вокруг всегда будут все 8 соседей. В этом подходе не придется проверять на выход за границы массива.

    А еще можно вместо 8 if-ов сделать цикл на 8 итераций, если завести константы для приращений:
    const int kDx[] = {1, 1, 1, 0, -1, -1, -1, 0};
    const int kDy[] = {1, 0, -1, -1, -1, 0, 1, 1};


    Теперь всех соседей можно перебрать как (i + kDx[k], j + kDy[k])
    Ответ написан
    Комментировать
  • Почему неправильно считывается строка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    file.get() читает один символ, возвращает его и переходит к следующему символу ввода. Поэтому код:
    while (file.get() != ']')
    {
       temp += file.get();
    }


    читает первый символ, сравнивает со скобкой, потом приписывает в temp второй символ. Потом читает третий и, возможно, приписывает четвертый и т.д. Два вызова file.get() выполняют два чтения.

    Правильно делать так:

    while ( (с = file.get()) != ']')
    {
       temp += с;
    }


    И похожим образом обрабатывайте '[' перед этим. Читайте в переменную, сравнивайте и не забудьте прочтенный символ засунуть в строку.

    Ну, или используйте в условиях istream::peek.
    Ответ написан
    Комментировать
  • Какой самый простой компилятор C/C++?

    GavriKos
    @GavriKos
    Любой компилятор под это подойдет.
    Ответ написан
    4 комментария
  • Почему работает const, а не constexpr для char*?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Дело в том, что указанный слева квалификатор const относится к правой половине спецификации типа до первого модификатора.
    const char& - ссылка на константный символ. Квалификатор - const, модификатор - &.
    const char* - указатель на память константного символа. Квалификатор - const, модификатор - *.

    При этом, указанный справа квалификатор const относится ко всей части спецификации типа левее, включая все модификаторы.
    char* const - константный указатель на память символа.
    const char* const - константный указатель на память константного символа.
    char* const * - указатель на память константного указателя на память символа.
    char& const существовать не может, т.к. квалификаторы не применяется к ссылкам. Тут будет ошибка трансляции.

    И при чем же здесь constexpr? Просто constexpr всегда относится только ко всей спецификации типа со всеми модификаторами.
    const char* - указатель на память константного символа.
    constexpr char* - константный указатель времени компиляции на память символа. Тут нет ошибки, память символа тут считается модифицируемой.

    И если объект с типом constexpr char* получит характеристику ODR-used [?], то после трансляции кода это будет уже объект с типом char* const. Вот так.
    В то же время, строковые литералы имеют тип const char[N], т.е. статически определенный массив константных символов. Такой тип можно привести только к типу const char*.

    В результате, чтобы правильно определить константный указатель времени компиляции на память константного символа, нужно тип определить как constexpr const char*.
    И const в этом месте никакого прямого отношения к constexpr не имеет.
    Ответ написан
    Комментировать
  • Почему из двух функций, стоящих в условии цикла, при определенных условиях выполняется только одна?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Фокус в оптимизации логических операций.
    Если первый операнд AND имеет значение false, то результат будет false независимо от значения второго операнда. Соответственно, вычислять второй операнд смысла нет.
    Аналогично, если первый операнд OR имеет значение true, то результат будет true независимо от значения второго операнда.
    Если вам нужно, чтобы выполнялись обе функции, то решением, как ни странно, будет явный вызов обоих функций в теле цикла с записью результатов выполнения в переменные.
    Ответ написан
    Комментировать
  • Вызвано исключение: нарушение доступа для записи. **_Str** было 0x1110112. Что не так?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Не выделена память для строки.
    P.S. И sizeof - это не длина строки.
    Ответ написан
    Комментировать
  • Как убрать нілики из ответа даного кода, ответ правильний только нулі виводить перед ответом?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Готов поклястся, что именно этот вопрос был задан вот тут.

    Но вы же, видимо, его и отредактировали, а теперь спрашиваете опять. Ответ там уже был мной дан.
    Ответ написан
    4 комментария
  • Можно ли сделать демона из программы, которая читает файл?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Да, можно.
    Ответ написан
    Комментировать
  • Как декодировать данное выражение?

    bingo347
    @bingo347
    Crazy on performance...
    Звездочка здесь относится к типу, а не к имени, и означает, что это указатель, просто синтаксис C позволяет здесь поставить пробел в любом месте (или не ставить его вовсе)
    По итогу, это функция match, которая принимает 2 аргумента - char и указатель на char, и возвращает так же указатель на char
    Ответ написан
    Комментировать
  • Как Вы обходитесь без "if"?

    maaGames
    @maaGames
    Погроммирую программы
    Количество строк кода не влияет на производительность. Пиши понятно, а не "решил написать тут, чтобы на одну строчку меньше было".
    Ответ написан
    Комментировать