• Какие средства для написания оконных приложений на C++ сейчас актуально учить?

    Adamos
    @Adamos
    MFC сейчас представляет только археологический интерес, WinAPI - палеонтологический.
    Вакансии с ними - это поддержка копролитов, которые некому переписать на что-нибудь хоть сколько-нибудь современное. Учить их - нелепо.
    Примерно так же нелепо учить программирование окошек на С++ только под Винду.
    Потому что половина интернета уже на мобилах, кусок давно на Маках, частичка на Линуксах, и ее тоже случается учитывать. А если программа жестко вин-онли - так ее и пишут скорее на Шарпе, по локоть в M$-библиотеках.
    Так что если желание писать на Крестах все еще есть, уже упомянутый Qt сейчас вполне разумный выбор.
    Ответ написан
    2 комментария
  • В разных IDE код выдаёт разный ответ, как так?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Оператор << не является точкой следования, таким образом, вы получаете неопределенное поведение - у вас вызовы ++(*val) не отделены точкой следования друг от друга.

    Вот так ошибки не будет:

    cout << a.get();
    cout << b.get();


    Потому что ; является точкой следования.

    В более свежих версиях стандарта может быть другая терминология, но суть проблемы - прежняя.
    Ответ написан
    Комментировать
  • В разных IDE код выдаёт разный ответ, как так?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Это тот самый случай, когда с виду простой код заставляет разобраться во множестве тонкостей языка.
    Для лучшего понимания проходящих в коде процессов сперва требуется внимательно присмотреться к стандарту языка.

    Что стандарт говорит нам о перегрузке операторов?
    A declaration whose declarator-id is an operator-function-id shall declare a function or function template or an explicit instantiation or specialization of a function template. A function so declared is an operator function.

    cout << a.get() << b.get();
    Данный код маскирует два вызова одной функции - std::ostream& operator << ( std::ostream&, int ).

    Тут очень важно уточнить форму перегрузки оператора, т.к. результат поведения этого кода сильно зависит от применяемой формы перегрузки.
    Относительно стандартной формы перегрузки operator << () стандарт говорит что это перегрузка в форме внешней функции.

    Значит приведенный код можно записать как:
    operator<<( operator<<( cout, a.get() ), b.get() );


    И именно с этого момента начинается самое интересное.

    Что стандарт говорит нам о вызове функций? А говорит он совсем разные вещи.
    C++14 [expr.call#5.2.2.8] заявляет, что:
    The evaluations of the postfix expression and of the arguments are all unsequenced relative to one another. All side effects of argument evaluations are sequenced before the function is entered (see 1.9).

    C++17 [expr.call#8.2.2.5] утверждает, что:
    If an operator function is invoked using operator notation, argument evaluation is sequenced as specified for the built-in operator; see 16.3.1.2.

    В результате, если транслировать данный код как код 14-го (или старших) стандарта, поведение у этого кода будет одно. Если же код транслировать как код 17-го (и моложе) стандарта, его поведение будет будет уже другим.

    А что же там с вероятным неопределенным поведением? Ведь неупорядоченная модификация состояния является UB. И, вроде как, cout << a.get() << b.get(); можно упростить до cout << ++i << ++i;, что уже более явно должно показывать наличие UB.
    UB в этом коде нет. И вот почему.

    Для определения порядка вычисления участков выражения следует руководствоваться правилами упорядочивания выражений.
    Среди прочих правил там записаны важные для нас сейчас. Я приведу цитаты.
    2) The value computations (but not the side-effects) of the operands to any operator are sequenced before the value computation of the result of the operator (but not its side-effects).

    3) When calling a function (whether or not the function is inline, and whether or not explicit function call syntax is used), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function.

    5) The side effect of the built-in pre-increment and pre-decrement operators is sequenced before its value computation (implicit rule due to definition as compound assignment)


    16) Every overloaded operator obeys the sequencing rules of the built-in operator it overloads when called using operator notation. (since C++17)

    19) In a shift operator expression E1<<E2 and E1>>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2. (since C++17)


    До C++17 порядок вычисления операндов cout << a.get() << b.get(); не определен, но поведение этого кода определено. Поэтому при трансляции по стандарту C++14 этот код может выдать или 12, или 21. Но не 11.
    Начиная с C++17 порядок вычисления операндов строго определен и является интуитивным, а результат выполнения cout << a.get() << b.get(); всегда однозначен. При трансляции этого кода по стандарту C++17 (и дальше) в консоль будет выведено всегда и только 12.
    До C++11 поведение кода cout << a.get() << b.get(); не определено.

    Сегодня мы уже не задумываемся о жизни до стандарта C++11, поэтому я не скажу что в общем смысле в этом коде присутствует UB. Я скажу что UB тут нет. Но тем не менее, я бы рекомендовал избегать присутствия подобного кода в проектах даже если используется стандарт C++17 и дальше.
    Ответ написан
    Комментировать
  • Для чего нужен возврат значения по ссылке?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    b = func(a);

    Вот тут вы взяли ссылку, которую вернула func и скопировали значение в переменную b. Поэтому ниже &b выведет вам адрес переменной b, а не то, что вы хотели.

    Возвращать ссылки бывает удобно, когда надо вернуть значение без копирования и оно всегда существует. Потому что функция, возвращающая указатель, вообще говоря, может вернуть и nullptr. По уму, надо бы этот указатель проверить перед разыменованием. А вот ссылки - они всегда куда-то указывают.
    Ответ написан
    3 комментария
  • Как не вызывать деструктор два раза?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Проблема здесь не в деструкторе, а в конструкторах. Тебе нужно реализовать конструкторы копирования и перемещения, иначе у тебя так и будут постоянно копироваться указатели из инстанса в инстанс, а при уничтожении будут в итоге такие крещи, как ты описал. Сейчас дефолтный конструктор копирования работает при передаче аргументов и при возврате из функции. Локально это можно полечить ссылками, но глобально – только правильные конструкторы.
    Ответ написан
    Комментировать
  • Данные, необходимые для завершения этой операции еще не доступны. (Исключение из HRESULT: 0x8000000A), как исправить?

    mrjbom
    @mrjbom Автор вопроса
    Решение:
    Создаём пустой CLR проект.
    Добавляем форму.
    Открываем вкладку
    Пишем это в имя_формы.cpp файле

    #include "имя_формы.h"
    #include <Windows.h>
    
    using namespace Имя_Вашего_Проекта;
     
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false);
        Application::Run(gcnew MyForm);
        return 0;
    }

    Сохраняем.
    Закрываем проект.
    Открываем снова, если появится окно с визуальным редактором, то там будет ошибка.
    Закрываем его.
    Открываем двойным нажатием имя_формы.h
    Done.
    Ответ написан
    1 комментарий
  • Как исправить ошибку EXC_BAD_ACCESS (code=1, address=0x0)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы "создаете" класс sf::RectangleShape через malloc в составе временных массивов pq, qr. Он оказывается заполнен мусором. Нарушены какие-то его внутренние инварианты. Может быть куча проблем: начиная от того, что там переопределен оператор присванивания, который должен что-то где-то почистить, заканчивая тем, что таблица виртуальных методов у класса будет испорчена. Любая попытка сделать что угодно с таким экземпляром класса - скорее всего неопределенное поведение.

    Если уж вы используете классы из C++, то выделять память надо через new[], а не malloc. Тогда экземпляр класса создасться нормально и конструктор вызовется.

    Можно было бы подумать, что memmove решил бы вашу проблему - но, опять же, при этом нарушаются внутренние инварианты. Какой-нибудь unique_ptr внутри будет уже не уникальным. Такие операции работы с памятью можно делать только для POD (Plain old data) - структур состоящих из структур, массивов и базовых типов.

    Или, еще лучше использовать vector для временных массивов. Тогда вам не придется заботиться об освобождении памяти. Еще, вместо копирования можно использовать std::move, может работать бысрее, если эти sf классы имеют более эффективные операторы перемещения.
    Ответ написан
    1 комментарий
  • Можно ли использовать SFML в проекте QT?

    Вот тут вы отключаете Qt
    CONFIG -= qt
    Если вам нужны библиотеки Qt, то эту строчку стоит убрать и добавить что-то вида (зависит от того, какие модули вам нужны)
    QT += core gui widgets network

    Далее, SFML подключается как обычная статическая или динамическая библиотека.
    В INCLUDEPATH вы указываете путь к файлам *.h библиотеки. В LIBS вы указываете с какими библиотеками будет происходить линковка. Не забывайте, что если вы не указываете в LIBS пути к линковке, то они должны быть указаны в QMAKE_LIBDIR.
    Ответ написан
    Комментировать
  • Можно ли менять логический оператор в зависимости от переменной?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    if (f_pos.x * x_direction > R) {
        rot_direction2 = false;
    }
    Ответ написан
    Комментировать
  • Почему не работает линк, если я переношу его в другую директорию?

    @Ragnar1
    Linux teacher for beginners.
    Чтобы разобраться с symbolic link нужно разобраться с типами путей, а именно знать, что есть абсолютный путь - путь, перечисляющий маршрут до папки/файла назначения от корня файловой системы, например ls /usr/bin - просмотр содержимого папки bin с помощью абсолютного пути; и знать, что есть относительный путь - путь, относительный текущей рабочей директории. например, чтобы попасть в /usr/bin из домашней папки пользователя, используя относительный путь, понадобится указать следующий маршрут: cd ../../usr/bin

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

    Теперь зная о путях и как работает symbolic link вы больше не будете путаться в этой теме! ;)
    Ответ написан
    Комментировать
  • Почему не работает линк, если я переношу его в другую директорию?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Если делаете относительной линк, а затем его копируете, то он будет ссылаться относительно нового каталога. Делайте линк ссылкой от корня файловой системы. Или создавайте линк сразу в нужном каталоге. Да в майкрософтп все тоже самое.
    Ответ написан
    Комментировать
  • Как изменить иконку приложения ubuntu?

    @0nkery
    Попробуйте заменить тильду ~ на /home/user.
    Ответ написан
    Комментировать
  • Что можно почитать, чтобы уметь работать с серверами на linux?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Почитать видимо стоит Unix руководство системного администратора. 8 издание.
    Ну а по теме определится что вам нужно и рыть в эту тему.
    Боты это больше в программирование, например питон, хотя программировать ботов можно на любом языке
    Ответ написан
    Комментировать
  • Что можно почитать, чтобы уметь работать с серверами на linux?

    Zuguki
    @Zuguki
    I'm working all the time!
    По поводу книг не знаю, но мне очень помог этот видео курс: https://www.youtube.com/watch?v=fAHpGshMCgQ&list=P...
    Рассказчик объясняет очень интересно и понятно.
    Ответ написан
    Комментировать
  • В какой университет из этих лучше поступить?

    @Atrelya92
    Крушу некрушимое
    Закончила МАИ по специальности инженер. Слабая подготовка именно в IT-направлении, устаревшая программа обучения. Поэтому, если вы хотите чисто "зацепиться". вам подойдёт. Опять-таки за последние года три МАИ сильно вырос по многим показателям. И достаточно простая учёба открывает двери в понимание, в каком бы направлении ты хотел бы развиваться. И да, платить, смысла реально нет. Сейчас решает не корочка,а опыт работы и набор знаний.
    Ответ написан
    Комментировать