Страницы

Поиск по вопросам

четверг, 6 декабря 2018 г.

Первые шаги в изучении GUI в С++

Здравствуйте. Вот начал изучать всем известный язык С++. Работа с консолей не было самым сложным этапом. Все давалось очень легко ибо до этого языка программирования имел опыт работы. Писал и тетрис и змейку в консоли. Все это очень прикольно, но хотелось бы не просто чёрный экрна, а что то больше, графический интерфейс, кнопочки всякие ну и т.п. Так вот, я слышал, что есть много библиотек таких как: OpenGL DirectX SDL Ну и другие. Что еще слышал об Qt, что стоит с него начинать. Так вот, собственно вопрос: С чего лучше начать? Может у кого-то есть литература или видео-уроки. Буду очень благодарен. Заранее спасибо.


Ответ

Так вам что именно нужно? Изучить кресты, или научиться делать всяческие...пардон, гуёвины (это от слова GUI, не подумайте плохого)?
Если второе, то C++ вряд ли можно назвать идеальным выбором для этого. Если первое, то лучше сконцентрироваться на возможностях самого языка, а конкретные задачи ставить себе уже по мере изучения. Что касается книг, то посмотрите ответы на этот вопрос
А вот что касается упомянутых вами библиотек, то они прямого отношения к ремеслу клепания окошек не имеют. Это библиотеки по работе с графикой. Если нет достаточных знаний языка и веских причин с ними связываться, то я бы на вашем месте не торопился в них углубляться, еще успеете

Си. Условные операторы в макроопределении препроцессора. Возможно ли?

Нужно исключить отладочные printf() из программы, применяя константу препроцессора. Обрамлять каждый вызов printf()
#if DEBUG == 1 printf(); #endif
не хочется. Можно ли сделать что-то типа:
#define printf(x,y) (if DEBUG == 1 printf(x,y) endif)
#if внутри макроопределений запрещены. Есть ли альтернатива?


Ответ

Можно определять макрос по разному в зависимости от значения DEBUG
#if DEBUG==1 #define printf_d(...) printf(__VA_ARGS__); #else #define printf_d(...) #endif
Но лучше сделать это немного по другому, проверяя не значение, а факт наличия макроопределения:
#ifdef DEBUG // . . .
Такой подход позволяет включить режим отладки простым указанием имени проверяемого макроса в Make-файле или даже в параметрах команды сборки.

Как правильно обнулить память?

Собственно очень интересует вопрос, если например массив нужно "обнулить", "очистить", не знаю как правильно выразится, чтобы туда не попал "мусор", нужно это делать мемсетом или можно заполнить массив нулями просто и это будет одно и тоже "{ 0 }", хотелось бы выслушать мнение людей с большим "опытом работы" в программировании, есть ли разница и может ли это повлечь какие-то проблемы в больших проектах(программах) или может это нужно делать как-то по другому?
OPENFILENAME ofn = { 0 }; ZeroMemory(&ofn, sizeof(ofn));
или
char FileName[260]; ZeroMemory(&FileName, sizeof(FileName));


Ответ

Для начала, локальные переменные необходимо инициализировать до первого чтения. Чтение неинициализтрованной переменной — очень серьёзная ошибка программиста, и может привести, например, к вылету программы. (Почитайте про undefined behaviour.)
Затем, код наподобие
OPENFILENAME ofn = { 0 };
уже есть инициализация, дополнительное «обнуление памяти» не нужно. (В современных версиях C++ обычно достаточно просто OPENFILENAME ofn = {};.)
В случае, когда вы объявляете массив, проще опять-таки попросить об инициализации компилятор (char FileName[260] = {};), чем обнулять массив вручную (ZeroMemory).
Другое дело, если вы хотите инициализировать массив ненулевым значением, это придётся делать вручную. Для «единичных» структур обычно можно всё ещё применять инициализацию:
MENUITEMINFO mii = { sizeof(MENUITEMINFO) };

Если вы собираетесь сразу же записывать данные в вашу структуру/массив, инициализация не имеет особого смысла. (Хотя хороший оптимизатор может увидеть это и выкинуть её.) Если вы собираетесь заполнять массив значениями, не имеет смысла перед этим прописывать всё нулями. Однако, если вы передаёте структуру/массив в чужую функцию, имеет смысл заранее посмотреть в документацию, читает функция эту структуру данных, или лишь заполняет её. Если вы твёрдо уверены, что функция лишь заполняет вашу структуру, можно пропустить инициализацию.

Программирование на android

Есть ли какие-нибудь приложения на Android, в которых можно писать код, который потом компилируется и запускается? Желательно, чтобы был один из известных языков, но главное, узнать есть ли IDE. Имеется ввиду, что код набирается в самом смартфоне


Ответ

Как ни странно, но это возможно. Вот по крайней мере одна ссылка. Интерпритатор паскаля. От себя добавлю, что на данный момент ни смартфоны, ни планшеты не позволяют заниматься программированием более-менее серьёзно. Может быть лет через 5-6... Сейчас основное предназначение (тех же планшетов) - потребление контента, а не его генерирование.

Как лучше всего убить зависший поток?

std::thread * tr1; tr1 = new std::thread([&]() { function(); // функция что то считает Sleep(3000000); // допустим это означает зависание });
Запущенный поток по каким то причинам завис, таймер определил, что поток выполняется дольше времени. Как можно убить поток, чтобы он не висел в памяти и не выполнял вычисления? В потоке нет никаких мьютексов и.т.д. Никакие переменные разрушится не смогут, туда передаётся указатель, который при обнаружении что таймер превышен задается в ноль. Больше поток ни с кем и ни с чем не контактирует.
Как его можно убить или поставить на паузу?


Ответ

Если на винде, то
TerminateThread(tr1->native_handle,0);
используйте на свой страх и риск :D

OpenGL шейдеры: стоит ли переходить на них?

Стоит ли сейчас переезжать с glBegin на шейдеры? Зачем их вообще ввели? Для каждого вида отрисовки свой писать что ли?


Ответ

Стоит, потому что, начиная с OpenGl es 2.0 для мобильных и opengl 3.2 для настольных отрисовка осуществляется исключительно при помощи шейдеров. Если Вы планируете использовать opengl в своей профессиональной деятельности - однозначно изучайте шейдеры и новые версии opengl. Кроме того, тут всплывают нюансы с поддержкой той или иной версии конкретной видеокартой и extensions.

Отправка POST запроса без перезагрузки страницы.

Как возможно и возможно ли вообще реализовать отправка POST запроса без перезагрузки страницы не подключая Ajax и jQuery?


Ответ

...