Ответы пользователя по тегу C++
  • Как сделать Static Build mac os c++ на qt creator?

    Profi_GMan
    @Profi_GMan
    Перекомпилтровать надо сам qt вам и выставить опцию соответственную (я про static build)
    Ответ написан
    Комментировать
  • В какой последовательности изучать C++? Разница между junior/midle в С++?

    Profi_GMan
    @Profi_GMan
    Учите сначала чистый с++, потом либо qt, либо .net.
    А между джуниором и мидлом разница только в опыте
    Ответ написан
    6 комментариев
  • Какие существуют библиотеки для ловли исключений и их отправки?

    Profi_GMan
    @Profi_GMan Автор вопроса
    В общем библиотека - google breakpad.
    Нужно сначала её собрать. И вот как я это сделал:
    Для начала нужно закинуть в папку папка_с_брикпадом\src\third_party вот это (библиотека lss) https://yadi.sk/d/BmWlgUmx3SHqka
    На линукс Просто полностью её скачал, после чего в корневой папке сделал ./configure && make. После этого .а файл будет в папка_с_breakpad\src\client\linux\libbreakpad_client.a
    На винде, я создал вот такой вот .pro файл в корневой папке breakpad и скомпилировал его:
    spoiler
    TEMPLATE = lib
    CONFIG += staticlib

    INCLUDEPATH += $$PWD
    INCLUDEPATH += $$PWD/src

    # Windows
    win32:HEADERS += $$PWD/src/common/windows/string_utils-inl.h
    win32:HEADERS += $$PWD/src/common/windows/guid_string.h
    win32:HEADERS += $$PWD/src/client/windows/handler/exception_handler.h
    win32:HEADERS += $$PWD/src/client/windows/common/ipc_protocol.h
    win32:HEADERS += $$PWD/src/google_breakpad/common/minidump_format.h
    win32:HEADERS += $$PWD/src/google_breakpad/common/breakpad_types.h
    win32:HEADERS += $$PWD/src/client/windows/crash_generation/crash_generation_client.h
    win32:HEADERS += $$PWD/src/common/scoped_ptr.h
    win32:SOURCES += $$PWD/src/client/windows/handler/exception_handler.cc
    win32:SOURCES += $$PWD/src/common/windows/string_utils.cc
    win32:SOURCES += $$PWD/src/common/windows/guid_string.cc
    win32:SOURCES += $$PWD/src/client/windows/crash_generation/crash_generation_client.cc

    после чего, в корневой папке появится .а файл
    Теперь нужно его (.а файл) подключить (в qt это LIBS += путь\имя.a в про файле) и дальше подключать стоит только заголовочный файл client/windows/sender/crash_report_sender.h для винды и client/linux/sender/crash_report_sender.h и всё. О том, что делать далбше можно прочитать здесь:
    https://maxsavenkov.livejournal.com/189460.html для винды
    https://gist.github.com/byronwind/94c94ee00dc442c71638 для linux
    Ответ написан
    Комментировать
  • Как получить место, откуда выбрасывается sigsegv и ему подобные?

    Profi_GMan
    @Profi_GMan Автор вопроса
    Для винды, чтобы узнать, шде произошло исключение, нужно:
    1. Компилировать в режиме отладки
    2. После выброса исключения создавать мини-дамп, который потом можно открыть с помощью windbg
    Но у этого спомоба есть недостатки:
    1. Если исключение произошло в библиотеке, то он скажет ту функцию, в которой произошло исключение, но не скажет, откуда эта функция была вызвана.
    2. Если использовать qt, то придёться тащить с собоё пару сотен мигабайт длл библиотек, вместо пары десятков, ибо длл для отладки весят где-то в десять раз больше
    Ответ написан
    Комментировать
  • Какую практическую задачу выбрать для изучения C/C++?

    Profi_GMan
    @Profi_GMan
    Первое, что я всегда на каком-либо языке писал - это калькулятор. И Вам рекомендую. Это хороший вариант потренировать написание ui, да и к тому же научит логике языка(рекурсия, классы). Только подходить к своему творению надо, как к большому проекту. Тогда Вы точно лучше усвоение базу языке и войдёте в его логику
    Ответ написан
    Комментировать
  • Как обратиться к элементу структуры?

    Profi_GMan
    @Profi_GMan
    if (strcmp(surname, en.surname) == 0 && en.meanMark==5)

    Вот так должно быть правильно
    Условие выполнится ТОЛЬКО если фамилия студента будет равна surname И если средний бал у него пять
    Ответ написан
    Комментировать
  • Есть ли аналог help() из Python3 в C++?

    Profi_GMan
    @Profi_GMan
    К сожалению нет, но и зачем? Там всё равно всё не опишешь... Подобное можно найти на сайтах, например ru.cppreference.com/w или en.cppreference.com (он часто корректнее)
    Ответ написан
    3 комментария
  • Как сделать такую конструкцию на C++?

    Profi_GMan
    @Profi_GMan
    vector<vector<тип_который_нужен> > blah { {1, 2} };
    blah.push_back({1, 4, 5});


    Как-то так.
    Ответ написан
    2 комментария
  • Как запустить команду cmd.exe без окна и получить вывод?

    Profi_GMan
    @Profi_GMan Автор вопроса
    И так, после дня мучений и разучивания winapi(а писал ранее всегда на линуксе), я написал рабочее решение:
    код
    DWORD _res = 22;
        QString strResult;
           HANDLE hPipeRead, hPipeWrite;
    
           SECURITY_ATTRIBUTES saAttr = { sizeof(SECURITY_ATTRIBUTES) };
           saAttr.bInheritHandle = TRUE;   //Pipe handles are inherited by child process.
           saAttr.lpSecurityDescriptor = NULL;
    
           // Create a pipe to get results from child's stdout.
           if ( !CreatePipe(&hPipeRead, &hPipeWrite, &saAttr, 0) ) {
               qCritical() << QObject::tr("Cannot create thread");
               return;
           }
           qDebug() << QObject::tr("Thread successfully created");
    
           STARTUPINFO si = { sizeof(STARTUPINFO) };
           si.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
           si.hStdOutput  = hPipeWrite;
           si.hStdError   = hPipeWrite;
           si.wShowWindow = SW_HIDE;       // Prevents cmd window from flashing. Requires STARTF_USESHOWWINDOW in dwFlags.
    
           PROCESS_INFORMATION pi  = { 0 };
    
           BOOL fSuccess = CreateProcessW( NULL, (LPWSTR)command.toStdWString().c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
           if (! fSuccess)
           {
               CloseHandle( hPipeWrite );
               CloseHandle( hPipeRead );
               qCritical() << QObject::tr("Cannot create procces");
               return;
           }
           qDebug() << QObject::tr("Proccess successfully created");
    
           int i = 0;
           bool bProcessEnded = false;
           for (; !bProcessEnded ;)
           {
               // Give some timeslice (50ms), so we won't waste 100% cpu.
               bProcessEnded = WaitForSingleObject( pi.hProcess, 50) == WAIT_OBJECT_0;
    
               // Even if process exited - we continue reading, if there is some data available over pipe.
               for (;;)
               {
                   i++;
                   char buf[1024];
                   DWORD dwRead = 0;
                   DWORD dwAvail = 0;
    
                   if (!::PeekNamedPipe(hPipeRead, NULL, 0, NULL, &dwAvail, NULL))
                       break;
    
                   if (!dwAvail) // no data available, return
                       break;
    
                   DWORD temp = sizeof(buf) - 1;
                   if (!::ReadFile(hPipeRead, buf, qMin(temp, dwAvail), &dwRead, NULL) || !dwRead)
                       // error, the child process might ended
                       break;
    
                   buf[dwRead] = 0;
                   strResult += buf;
               }
           } //for
    
        if(GetExitCodeProcess(pi.hProcess, &_res) == 0) _res = GetLastError();
           CloseHandle( hPipeWrite );
           CloseHandle( hPipeRead );
           CloseHandle( pi.hProcess );
           CloseHandle( pi.hThread );

    Кому нужно, вот класс с этой функцией и под винду, и под линукс.

    Я пишу на qt. Если вы не пишете на нём, то QString можно заменить на std::string, от этого ничего не изменится. Также можно убрать qDebug(), это логирование с помощью фреймворка qt, если вы на нём не программируете их надо заменить или удалить. И qMin() можно заменить на std::min()
    Ответ написан
    Комментировать
  • Как получить вывод и возвращаемое значение команды batch?

    Profi_GMan
    @Profi_GMan Автор вопроса
    В общем, разобрался я: Надо вызвать system("команда>файл_куда_будет_выводиться_результат 2>&1"). Тогда от функции system() мы получим возвращаемое значение, а вывод команды будет в файле, который вы указали
    Ответ написан
    Комментировать