• Как с помощью QT вывести на монитор 10-битное изображение?

    @Ariox41
    Похоже на банальный неправильный порядок байт. Чтобы меньше зависеть от платформы, я бы делал так:
    for (int row = 0; row < 400; row++) {
        for (uint8_t partA  = 0; partA  < 256; partA  ++) {
            for (uint8_t partB  = 0; partB  < 4; partB  ++) {
               arr->append (partA);
               arr->append (partB);
            }
        }
    }

    Возможно, еще нужно поменять местами partA и partB , нужно уточнить, какой порядок используется в QImage
  • Как собрать QT C++ прорамму под младшую версию stdlibс++.so.6?

    @Ariox41
    Если вам доступен Qt 4.8.7, значит должен быть доступен хотя бы Qt 5.5.1, с ним проблем уже меньше. Ну и вам в любом случае периодически нужно пересобирать программу на целевой системе из исходников, т.к. иначе вы рискуете пропустить специфичные для Астры баги (а они есть, хотя в последних версиях и поменьше). А во время основной разработки можно использовать стандартный для вашей ОС компилятор и Qt, если основная версия Qt совпадает. Для удобства еще можно поставить Астру на виртуалку, но тут есть проблема с лицензированием.
  • Каков статус языка Rust в данный момент?

    @Ariox41
    На новый год был пост с планами на развитие языка. Основная мысль - через год ни у кого не должно быть причин использовать c++ в новых проектах. Утверждение, конечно, оптимистичное, но забрасывать Rust точно никто не собирается.

    В соответствующей ветке rust на reddit много обсуждений на тему развития языка, если интересно.
  • Причины утечек памяии?

    @Ariox41
    Явно запретите конструктор копирования и перемещения в A и, если есть, удалите их из потомков. Если программа перестала компилироваться - в этом месте была ошибка из-за срезки. Если копирование в этом месте всё же нужно - создайте виртуальный метод copy в класса A и определите в потомках.

    Ну или выложите код.
  • Почему gcc printf(%s, array) правильно выводит массив типа char, который не является NULL-terminated строкой?

    @Ariox41
    forgoty, У вас массив на стеке, которым фактически управляет компилятор. Вполне возможно, что для данного компилятора этот код будет работать всегда, но любое его изменение может изменить поведение.
  • Как учить C++ программисту который не учился в вузе в данной сфере?

    @Ariox41
    Роман, "Эффективный и современный С++: 42 рекомендации..." - не лучший выбор для начала, она посвящена именно нововведениям C++11/14. Основные идеи Modern C++ изложены в предыдущих книгах.
  • Как правильно использовать QWidget в QML?

    @Ariox41
    WTFAYD , да, напрямую не получится, про это я забыл. Там еще другие проблемы есть, тут пишут, что хорошего способа вообще нет, но там же есть и обходные пути для последних версий Qt.
  • Qt C++ QTableWidget как задать цвет стоки?

    @Ariox41
    Попробуйте
    item.setData(Qt::BackgroundRole, QColor(Qt::green));
    . Вообще, для более-менее сложных таблиц предназначены QTableView с моделью и делегатами, QTableWidget не столь гибок.
  • Корректен ли этот код?

    @Ariox41
    Vitaly, исправил, хотя пояснение по этому поводу было и раньше. А доверять ответу с фразой "есть только стек и куча" - не самая лучшая идея (в стандарте нет этих терминов).
  • В каких случаях эффективнее дублирование кода вместо вызова функции?

    @Ariox41
    Виталий, в gcc есть атрибут __attribute__((always_inline)), который гарантирует встраивание. Но его не рекомендуют использовать, т.к. на практике это только усложняет разработку, но не приводит к заметному повышению производительности - у компилятора лучше получается определять, когда необходимо встраивание. В VC вроде бы тоже есть подобный атрибут.
  • Что за ошибка с Boost.Asio?

    @Ariox41
    Даниил Демидко: Да, код выше - это клиент. Причем я не уверен, что он вообще будет работать, т.к. нет привязки к ioservice. У меня работал такой вариант подключения:
    int start_client (std::string host, std::string port){
            using boost::asio::ip::tcp;
    	namespace asio = boost::asio;
    	asio::io_service io_service;
    
    	try
    	{
    		std::vector<char> data_request(max_length, ' ');
    		std::vector<char> data_reply(max_length, ' ');
    
    		tcp::socket s(io_service);
    
    		tcp::resolver resolver(io_service);
    		boost::asio::connect(s, resolver.resolve({host, port}));
                    // далее передача данных
            } сatch (std::exception& e){
    		std::cerr << "Exception: " << e.what() << "\n";
                    return -1;
    	}
            return 0;
    }


    Вообще, я бы посоветовал заглянуть сюда, там есть пример echo сервера.
  • Как исправить ошибку линкера?

    @Ariox41
    Павел Каптур: Порядок сборки имеет значение. У вас по каким-то причинам конечный исполняемый файл собирался раньше, чем компилировался ModuleClass.cpp, но позже, чем компилировался main.cpp. Я не знаю, как устроен Android.mk, но вполне возможно там есть декларация, запускающая сборку, а ModuleClass.cpp был добавлен после этой декларации. Или просто компиляция осуществляется в порядке, в котором файлы записаны в Android.mk, и файл с функцией main всегда должен быть последним в списке (если это не динамическая библиотека).
    Еще вариант, компиляция и сборка может осуществляться в разных каталогах, из-за чего среда сборки производит копирование файла / создание символьных ссылок. Оба этих процесса могут завершится неудачей по каким-то причинам (у меня так было со сборкой android приложения под windows при помощи qmake).
  • Как исправить ошибку линкера?

    @Ariox41
    Евгений Шатунов: Эм... Вы дали ссылку на правило "Определите деструктор, если класс нуждается в явном действии при уничтожении объекта". Но весь смысл моего ответа сводился к тому, что деструктор не нужно определять (реализовывать). Строка ~ModuleClass() = default; как раз и означает, что он не определяется вручную. default не определяет деструктор, в данном случае он носит роль комментария, с тем же успехом я мог написать //~ModuleClass() - деструктор по умолчанию.

    А еще там есть такое правило.
  • Как исправить ошибку линкера?

    @Ariox41
    Евгений Шатунов: Возможно, вам изначально следовало поинтересоваться, обязательна ли эта строка? Строка не обязательна, без неё ничего не изменится. Но слово default при объявлении функции изначально носит функцию документирования (наряду с другими), и означает, что будет использовано решение по умолчанию (в случае специальных функций, тело генерируется автоматически). Поскольку это основы языка, я не посчитал нужным уточнять это, тем более что значение слова default совпадает с последствиями его применения. Стоящий рядом комментарий относится к деструктору, а не к к слову default.
  • Как исправить ошибку линкера?

    @Ariox41
    Евгений Шатунов: Слово default никак не связано со словами "генерируется автоматически благодаря умным указателям". Это всего лишь означает, что используется деструктор по умолчанию, что описывается в стандарте.
    А вот деструктор по умолчанию уже генерируется в соответствии с правилом "вызвать деструкторы для всех членов класса" (+ еще указывается порядок вызова и учитывается наследование, но сейчас это не важно). Вывод специальных функций-членов (к которым относится деструктор) описывается в этом разделе, а также в любом учебнике по C++ для начинающих.

    Умные указатели являются одним из типичных случаев использования RAII, вторым типичным случаем являются стражи для мьютексов (эти примеры приводятся по ссылке, которую я уже давал: RAII. Где-то в стандарте это тоже упоминается, но мне лень искать.
  • Как исправить ошибку линкера?

    @Ariox41
    Евгений Шатунов: Про управление ресурсами читайте Майерса. Или читайте про RAII, например, тут.

    Деструктор не может быть не объявлен, он всегда генерируется автоматически, если не объявлен вручную. Проблема в том, что деструктор по умолчанию просто вызывает деструкторы, составляющие класс объектов (не delete для объекта, а сам деструктор). В случае встроенных типов, в том числе, указателей, по сути не происходит ничего (т.е. динамически выделенная память не освобождается). Умные указатели в своём деструкторе освобождают память, если она была выделена (unique_ptr). Кроме того, можно использовать пользовательский удалитель для unique_ptr, чтобы добавить дополнительные действия (например, мьютекс можно освободить, поток подождать (wait) или отпустить (detach)).
  • Как исправить ошибку линкера?

    @Ariox41
    Павел Каптур: На C++98 есть auto_ptr. Или можно вообще не использовать указатели. В любом случае, смысл там в том, что когда в теле класса несколько указателей/дескрипторов, высок шанс утечки ресурсов, когда часть ресурсов уже создана, а часть - нет. Умные указатели позволяют решить проблему, т.к. автоматически освобождают ресурс, если он выделен, и не освобождают, если нет.
    Если у вас создан хоть какой-то деструктор, но компоновщик его не видит, значит вы не подключили библиотеку с этим деструктором. У вас скорее всего есть main.cpp и module_class.cpp, их оба нужно скомпилировать, а затем собрать компоновщиком получившиеся *.o файлы в исполняемый файл. Обычно для этого используют системы автоматизации сборки типа CMAKE.
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Судя по этому ответу, проблема тут более глубокая, и она не связана с boost. Тут я ничем помочь не могу, нужно разбираться с линкером и, возможно, пересобирать Qt с другими флагами. Можно попробовать для начала сменить версию компилятора, для этого в настройках сборки Qt нужно добавить новый комплект, в котором указать нужный компилятор (если он не найден автоматически, нужно найти путь к нему вручную). QtCreator скорее всего при этом подставит неверной имя компилятора при запуске qmake, из-за чего нужно явно указывать его в .pro, у меня это выглядит так: QMAKE_CXX = i686-linux-android-gcc-5.3
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: я пару дней назад пытался настроить сборку для android под windows, у меня возникла другая проблема: qmake не экранирует пути, из-за чего на этапе установки (перед запаковкой в apk) mingw32-make вызывал команду copy с ошибочным синтаксисом (под linux дефисы не нужно экранировать, но cmd дефисы считает ошибкой синтаксиса). Судя по всему, это от версии qmake зависит.
    У вас, кстати, в этом месте тоже какое-то сообщение от mingw32-make появляется в кривой кодировке. Чтобы прочитать его, рекомендую запустить qtcreator следующим скриптом:
    @echo off
    reg add "HKCU\Software\Microsoft\Command Processor" /v AutoRun /t reg_expand_sz /d "chcp 1251 1>nul" /f
    qtcreator.exe
    reg delete "HKCU\Software\Microsoft\Command Processor" /v AutoRun /f

    (подробнее)

    Ну и на всякий случай,
    мой .pro файл
    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TEMPLATE = app
    
    CONFIG += c++14
    CONFIG -= debug_and_release debug_and_release_target
    
    DEFINES += QT_DEPRECATED_WARNINGS
    
    SOURCES += main.cpp\
            mainwindow.cpp
    
    HEADERS  += mainwindow.h
    
    FORMS    +=
    TEMPLATE = app
    CONFIG += mobility
    MOBILITY =
    
    LIBS += \
        -L"D:/Development/android/crystax-ndk-10.3.2/sources/boost/1.59.0/libs/x86/gnu-4.9/" -lboost_regex \
        -L"D:/Development/android/crystax-ndk-10.3.2/sources/crystax/libs/x86" -lcrystax
    
    INCLUDEPATH += "D:/Development/android/crystax-ndk-10.3.2/sources/boost/1.59.0/include"
    DEPENDPATH += "D:/Development/android/crystax-ndk-10.3.2/sources/boost/1.59.0/include"
    
    ANDROID_EXTRA_LIBS += \ 
        "D:/Development/android/crystax-ndk-10.3.2/sources/boost/1.59.0/libs/x86/gnu-4.9/libboost_regex.so" \
        "D:/Development/android/crystax-ndk-10.3.2/sources/crystax/libs/x86/libcrystax.so"
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Для начала, определитесь, какой тип связывания вы используете: динамический, или статический. Часть библиотек можно подключать динамически, часть - статически, но конкретную библиотеку нужно подключать однократно, одним из способов, иначе могут возникнуть проблемы.

    Сообщение об ошибке означает, что не найден конструктор класса std::__cxx11::string (который заменяет std::string в c++11), на который ссылается libboost_regex.so. Не знаю, почему это произошло, возможно, какая-то несовместимость. Возможно, проблему решит статическое связывание с boost.