Ответы пользователя по тегу C++
  • Подходит ли JavaScript для Game Development?

    Nipheris
    @Nipheris Куратор тега C++
    Выбор почти полностью зависит от алгоритмической и графической сложности ваших игр. Логично, что если у вас есть желание выжать максимум, то вам нужно как можно меньше накладных расходов и минимум абстракций, поэтому в этом случае - плюсы.
    Если важнее скорость разработки и простота доставки пользователю - то JS
    Ответ написан
    3 комментария
  • Как передать по TCP несколько переменных?

    Nipheris
    @Nipheris Куратор тега C++
    Вам нужно делать write для каждой переменной или буфера, который вы хотите передать. Например, что мешает сделать так:
    int len = strlen(str);
    double val = 6.0;
    write(sockfd, &len, sizeof(len)); // длина
    write(sockfd, str, len); // строка
    write(sockfd, &val, sizeof(val)); // еще какой-то там дабл

    Также нужно прочитать на другом конце. Что из этого не получается?
    Ответ написан
  • Для чего нужна передача объекта в функцию по значению и по указателю в С++?

    Nipheris
    @Nipheris Куратор тега C++
    Как передавать - по значению или по указателю - целиком зависит от природы объекта (ссылки - отдельная история, отвечу ниже).
    Существует две важнейших категории обрабатываемых в программе данных, которые редко рассматриваются в явном виде, но от которых, как говорится, не убежишь, по кр. мере в нефункциональном языке.
    Первая категория - это "значения". Я не готов вам дать сейчас точное определение, но можете представлять себе эту категорию как те значения, что вы знаете из математики. Особенностью этих "значений" является то, что они несут ровно столько информации, сколько в них самих есть (в их представлении в ЭВМ). Ну то есть если вы видите строку "Василий", и другую строку "Василий" в другом месте, то как "значения" они ничем не отличаются. Также, одно целочисленное значение 5 ничем не отличается от другого 5. Кроме того, у значения нет жизненного цикла - у него нет прошлого и будущего, оно есть такое, каким оно было создано. Иными словами, у значения нет понятия изменяемости, оно не привязывается ко времени. Значение 6 - это уже другое значение, и неважно, как оно было получено. Важно, что значения не обязательно должны быть примитивными: комплексное число (5, 7) это такое же значение, как и его составляющие 5 и 7.
    Вторая категория - это "переменные". Это уже совсем другие сущности в программе. Это такие контейнеры, куда кладутся значения, причем под "кладутся" понимается хорошо знакомая вам операция присвоения. Важно, что несмотря на то, что переменная как контейнер может содержать различные значения в разные промежутки времени, у нее всегда есть некоторый неизменный идентификатор. В языках с прямым доступом к памяти, таких как C++, это указатель. Неважно, где находится ваша переменная - на стеке или в куче - важно, что это контейнер, и у него есть уникальный идентификатор. Т.к. содержимое контейнера может изменяться - то мы можем говорить о прошлом и будущем этого контейнера, зная его идентификатор.
    Если сузить понятие объекта до такой сущности, которая может изменять свое состояние, то объект в проекции на язык C++ - ничто иное, как переменная с четко определенным интерфейсом изменения состояния. Отсюда вытекает, что в плюсах identity объекта - это есть указатель на участок памяти, где этот объект находится.
    Когда вы сравниваете значения, вы должны сравнивать их "начинку". Понятно, что ваши значения технически лежат в каких-то переменных, но 5 и 5 будут равны вне зависимости от того, где каждая из них находятся.
    Другое дело объекты. Их природа такова, что один Студент не эквивалентен другому Студенту, если их identity, т.е. указатели, различаются (соотв-но, если указатели совпадают, то это, безусловно, один и тот же Студент). Это в общем-то очень хорошо моделирует реальный мир: даже если у студентов совпадают ФИО и дата рождения (и вообще все данные, что мы о них имеем) это не значит, что это один и тот же человек.
    Когда вы плотнее займетесь ООП в C++ вы поймете, что именно адрес объекта в памяти - первичная информация для начала манипуляций с объектом. Адрес можно передать не только указателем, но и ссылкой, однако именно указатели, например, удобно сравнивать друг с другом. Список из студентов - это std::list<Student*>, а не std::list<Student>. Безусловно, вам никто не мешает использовать второй вариант, но тогда ваши студенты будут значениями (!), а не объектами (кстати, именно во втором случае std::list потребует от вас оператора сравнения для студентов).
    Т.к. в С++ все значения копируются по умолчанию (перемещение сейчас не рассматриваем), то для моделирования "объектов", как самостоятельных сущностей с собственным жизненным циклом, нам нужны указатели и ручное управление памятью.
    Ссылки - это лишь обертка, которая превращает указатель либо в l-value, либо в r-value, в зависимости от ее типа. const string& - это экономный способ смоделировать передачу "значения", а Student& - это по сути то же самое, что и Student*.
    Ответ большой и сумбурный, но вам нужно еще со многим разобраться. Если что не понятно - спрашивайте в комментах.
    Ответ написан
    3 комментария
  • Какую библиотеку выбрать для создания GUI-приложений?

    Nipheris
    @Nipheris Куратор тега C++
    Ничего не имею против GTK, но для серьезных приложений с будущей поддержкой - Qt. С будущим у него все нормально. Если отбросить вопрос сложности языка (C++ против Java/C#), то на сегодняшний день я бы порекомендовал его даже для Windows-only приложений.
    Сейчас очень интересно выглядят современные наработки, такие как Qt Quick.
    Ответ написан
    4 комментария
  • Какова должна быть структура проекта на Qt?

    Nipheris
    @Nipheris Куратор тега C++
    Я думаю структура проекта мало определяется самим Qt, и будет такая же, как и других C++ - проектов. Однако положить файлы в подпапку вам никто не запрещает.
    Ответ написан
    Комментировать
  • Какой язык программирования изучить новичку для написания GUI приложений?

    Nipheris
    @Nipheris Куратор тега C++
    Зависит от запаса времени и сил. Если знакомый имеет возможность учиться (уж в 16-то лет), то я бы советовал плюсы. Да, это достаточно хардкорно, но все-таки этот язык как средство разработки просто так никуда не денется, а C# после плюсов он выучит без проблем (когда он хорошо разберется в C++, ему самому захочется иметь для ряда задач такой язык, как C# или Java). Главное в том, что если он сможет дисциплинировать себя в рамках C++, и сможет писать работоспособные вещи, то будет знать, как вообще работает современное ПО, и для него любой другой язык будет просто инструментом, а не парадигмой.
    Важно, чтобы у человека УЖЕ был опыт хотя в одном языке. Если он учил Паскаль - то пусть хорошенько все вспомнит, может даже первые пару недель еще с ним позанимается. Пусть вспомнит, какие есть основные алгоритмические конструкции, структуры данных подучит, вспомнит что такое указатели. И в это же время пусть начинает переходить на плюсы. Еще стоит поискать хорошую современную книгу для новичка - C++ язык очень разносторонний, разные люди на нем пишут очень по-разному, поэтому нужен некий "направитель". Потом, когда человек освоится, сам выберет стиль и инструментарий.
    Если же знакомый слукавил, и еще совсем мало знает, то лучше начать с чего-то другого. Тут уже зависит от текущих интересов: если комп интересует как "железка", то лучше взять Си - будет "продолжение" Паскаля, если очень-очень охота быстро набросать формочку - то пусть берет C#.
    Динамические языки вроде Питона новичку не советую, плохо дисциплинируют.
    В плане инструментов Qt сейчас настолько крут, что даже под винду непросто выбрать: то ли его, то ли продвинутый, но сложный и слаборазвивающийся WPF, то ли противоречивый Windows Runtime.
    Кстати, насчет того, что сложнее - C++&Qt или C#&WPF еще можно поспорить. В первом случае сложен язык, но довольно проста библиотека, во втором - язык проще, но с WPF надо реально разбираться, чтобы им полноценно пользоваться.
    Ответ написан
    1 комментарий
  • Валидно ли передавать ссылку по ссылке в C++?

    Nipheris
    @Nipheris Куратор тега C++
    > ссылок на ссылки
    Это не ссылка на ссылку. В функцию b попадет точно такая же ссылка, что и в f. Ссылки ведут себя как "вторые имена" для переменных, поэтому когда вы инициализируете одну ссылку другой, вы просто добавляете в распоряжение еще одно имя для куска памяти. Такого понятия, как ссылка на ссылку в принципе быть не может, в отличие от "указатель на указатель", т.к. указатель сам по себе - реальная самостоятельная переменная с выделенной для нее памятью, на которую, в свою очередь, также можно получить указатель. Ссылка - это запись в таблице идентификаторов компилятора. Да, в зависимости от ситуации для обеспечения ее работы может потребоваться указатель (например, при передаче ссылки в функцию нужно как-то передавать адрес), но этим уже занимается компилятор, поддерживая для вас абстракцию ссылки.
    Другое дело - это, как указал Александр Ручкин - время жизни объекта, это другая история. Разумеется, тот объект или значение, ссылку на который мы сформировали, должны "жить", пока к этому объекту идут какие-либо обращения на чтение/запись.
    UPD: Кстати, int&& - это НЕ ссылка на ссылку, это r-value ссылка и совсем другая история.
    Ответ написан
    Комментировать
  • Как красиво организовать работу с little-endian файлами?

    Nipheris
    @Nipheris Куратор тега C++
    > Но хочется как то использовать уже реализованные классы потоков if/ofstream - чего добру то пропадать.
    Их и используйте, я бы на вашем месте сделал обертку вокруг другого istream-а (и ostream-а соответственно). Chaining потоков - классический способ решения такой задачи (и не только в плюсах, разумеется). Точно также, например, делают поток-расшифровщик, или поток-расжиматель, если сжатие было поточное (deflate например).
    > что я не знаю точный список всех таких методов, да и вообще недостаточно хорошо знаю устройство работы if/ofstream, чтоб сильно в них ковыряться.
    Какая-то странная причина. Так разберитесь). Список он вполне конкретный, для этого есть стандарт. Справка высокого качества по стд. библиотеке есть на en.cppreference.com/w
    Ответ написан
    2 комментария
  • Плюсы и минусы фронта и бэкэнда?

    Nipheris
    @Nipheris Куратор тега C++
    > третья суровая разработка на кроссплатформенном C++ (опять же ближе к миддлу)
    Чего же вы ждете? Это штучные вакансии, черт возьми!
    Ответ написан
    Комментировать
  • Как выполнять функцию без зависания главной формы в qt?

    Nipheris
    @Nipheris Куратор тега C++
    Берете и разбирайтесь с QThread. Для остановки/запуска используете сигналы/слоты (смысл QThread в том, что он умеет запускать свой eventLoop, и ловить QueuedConnection-сигналы из других потоков)
    Ответ написан
    Комментировать
  • Не удается разрешить сборку VC90.DebugCRT?

    Nipheris
    @Nipheris Куратор тега C++
    Значит так, во-первых вам для Qt и для вашего приложения нужно использовать один тулчейн (компилятор), иначе будет огромное количество странных проблем. Т.к. вы разрабатываете в 2012-й студии, а, к сожалению, официально 4-й кьют под эту студию не собирался, вам придется как минимум поставить компилятор из 2010-й студии (не помню, возможно 2012-ю можно таргетировать на старый компилятор, чтобы не ставить 2010-ю студию целиком). Можно и попробовать собрать из исходников, но я не могу назвать это простым делом.
    Во-вторых, если мы представим, что вы выполнили предыдущий этап, и у вас есть собранный Qt и компилятор той же версии, то в зависимости от конфигурации (Debug|Release) ваша программа будет линковаться на разные рантаймы. DLL-файлы рантайма имеют букву 'd' в конце имени файла. Для разных версий VC++ они называются по разному:
    msvcr90[d].dll+msvcp90[d].dll - Visual Studio 2008 (MSVC 9.0)
    msvcr100[d].dll+msvcp100[d].dll - Visual Studio 2010 (MSVC 10.0)
    msvcr110[d].dll+msvcp110[d].dll - Visual Studio 2012 (MSVC 11.0)
    msvcr120[d].dll+msvcp120[d].dll - Visual Studio 2013 (MSVC 12.0)
    Для чего я это привел - т.к. ваша ошибка прилетела скорее всего из подсистемы side-by-side, и связана с конфликтом версий библиотек, в качестве workaround советую вам найти дебаг-библиотеки там где у вас установлена студия, и скопировать из к exe-шнику вашего приложения, чтобы эти библиотеки подхватывались приоритетнее. Однако перед тем, как вы это сделаете, попробуйте следующее:
    0) разберитесь с версией компилятора, под которую собирался Qt. Возможно лучшее решение - таки поставить компилятор из 2010-й, не решив этот вопрос продолжать нормально работать невозможно
    1) убедитесь, что пересобрали проект (сделайте Rebuild All)
    2) поставьте апдейты на 2012-ю студию, если она не последней версии
    Если проблема останется, возьмите Dependecy Walker, натравите на Exe-шник, и проверьте, откуда он подтягивает debug-библиотеки.
    Если есть вопросы - в комментарии.
    Ответ написан
  • Что означает time при использовании этого класса?

    Nipheris
    @Nipheris Куратор тега C++
    mersenne_twister_engine - вот сам класс mt19937 (сейчас он уже в std есть, так что не факт что буст используется), вот его конструктор: mersenne_twister_engine/mersenne_twister_engine, вот что пишут про его единственный параметр:
    > value - seed value to use in the initialization of the internal state
    Т.е. это зерно для вашего рандом-генератора. Как часто это делается в задачах, не требующих высокого уровня безопасности, зерном берется текущее время.
    А вот собственно функция time. Она принимает один параметр - указатель на time_t, и возвращает также time_t. В любом случае она вернет текущее время, если же вы в кач. первого параметра передадите ненулевой указатель, то она еще и по нему запишет текущее время. В вашем примере передается NULL, т.к. используется возвращаемое значение.
    А вот это - uniform_int_distribution - класс равномерного распределения случайной величины. Скорее всего дальше по коду он используется вместе с рандом-генератором для получения значений случайной величины, удовлетворяющих этому равномерному распределению.
    Ответ написан
    Комментировать
  • Указатель на функцию из библиотеки на Си в С++ класс?

    Nipheris
    @Nipheris Куратор тега C++
    Очень просто: чтобы поменьше влиять на остальной код на C++, который у вас уже написан, сделайте следующее:
    1) заведите обычную функцию (НЕ член класса) send_sms, указатель на которую отдадите в либу;
    2) сделайте в этой функции все, что необходимо по задаче (отправить смс? :));
    3) реализуйте для MainWindow синглтон (проще) или сервис (правильнее), чтобы иметь возможность получить доступ из внешней функции send_sms к экземпляру окна;
    4) у MainWindow дергайте метод test или любой другой, чтобы передать в него нужные данные. Если сделаете синглтон, будет что-то вроде этого: MainWindow::instance()->test(...);
    Ответ написан
    Комментировать
  • Что у меня не так с регулярными выражениями в C++?

    Nipheris
    @Nipheris Куратор тега C++
    ideone.com/ZIl4Ze - вот ваш код, вполне себе работает. Так что версию компилятора в студию. На всякий случай проверьте, что у вас все перекомпилируется как надо.
    Ответ написан
    2 комментария
  • Можно ли доработать odbc-драйвер?

    Nipheris
    @Nipheris Куратор тега C++
    Вот вроде понятно, что вы хотите сделать, но непонятно, зачем вам для иморта ODBC, если вам придется разбирать бинарник. Прочтите его стримами как вам надо, а в Excel уже загрузите с помощью ODBC, ну или что вы там используете. Если я не понял задачи, поясните пожалуйста.
    Ответ написан
    Комментировать
  • Вопрос по C# и net framework?

    Nipheris
    @Nipheris Куратор тега C++
    > Не каждый пользователь будет его устанавливать.
    Кто еще не установил - тому стоит это сделать, MS даже через апдейт систему предлагает дотнет поставить. А еще фишка в том, что и программам на плюсах в подавляющем большинстве случаев приходится ставить райнтайм. Конечно, его dll-ки можно просто положить в папку с программой, но это плохой путь по ряду причин. Итого, и для шарпа и для плюсов нужно ставить "среду", единственное отличие - рантайм плюсов будет легче (правда сама прога, юзающая Qt и включающая его библиотеки будет значительно тяжелее).
    > На сколько я знаю, на семерке "из коробки" стоит 3 версия фреймворка
    Тройка - на Висте, на семерке - 3.5.
    > Так что же лучше - использовать C# или посмотреть в сторону C++ и Qt?
    Тут обычно гораздо важнее вопрос кроссплатформенности. Сейчас Mono обеспечивает только WinForms, т.е. того же WPF на никсах пока не видать (и видимо уже не увидим). Поэтому я сейчас безоговорочно выбрал бы Qt, если б делал десктоп-софтину не только для винды (в 2015 году лично я не могу относиться к функциональности и CPU-oriented архитектуре WinForms всерьез). Поэтому решение принять достаточно просто:
    1) если у вас line of business-приложение (напр., очередная утилитка для расчета кредитных условий по продуктам банка) и windows-машины в парке - смело берем C#, WPF, и решаем поставленную задачу;
    2) если у вас приложение для широкого круга лиц, и его интерфейс сложнее интерфейса перекодировщика WAV в MP3 - берем Qt, пишем код без и получаем приложение, которое запустится на большинстве десктопных машин, а не только на тех, где винда.

    P.S.
    1) безусловно, есть и более чем приличные коммерческие десктопные программы на шарпе, например очень удобный и навороченный референс-менеджер Citavi, но я думаю её авторы просто приняли решение поддерживать только винду, и это их устраивает. Кроме того, они используют много сторонних платных GUI-контролов у себя в продукте.
    2) реализовывать взаимодействие управляемого и нативного кода не так уж приятно, поэтому если ключевая библиотека реализована на плюсах, то и остальное приложение логично сделать нативным.
    Ответ написан
    Комментировать
  • Как последовательно показать результаты изменения одной переменной многими потоками?

    Nipheris
    @Nipheris Куратор тега C++
    > Просто синхронные вызовы ролла показывают лишь последний результат.
    ну так а почему асинхронность сразу значит - несколько потоков? И причем тут вообще асинхронность - вам нужно сделать нормальную анимацию, анимация - это отрисовка кадров в соответствии с ходом времени. Последний результат виден потому, что вы не возвращаете управление в цикл приложения, чтобы оно могло нормально обработать прочие сообщения. Уберите всю эту многопоточность, сгенерьте рандомом перед анимацией все игры, которые хотите мельком показать, поставьте обыкновенный таймер (QTimer) и отрисовывайте по сигналу таймера игры по очереди, пока не дойдете до последней - той что "выпала". Разберитесь с матчастью по mainloop и анимации и все станет ясно как божий день. Еще раз - никаких потоков для вашей задачи вам не надо, тем более 20 штук.
    Ответ написан
  • Переход с C# на C++?

    Nipheris
    @Nipheris Куратор тега C++
    > выкидывать полученные знания на помойку и начинать все с начала
    ничего вы никуда не выкинете. На плюсах вам просто чуть больше решений придется принимать самому, и дисциплина, скажем так, строже. Главные Знания - это методологии разработки, алгоритмы и общие навыки по написанию и отладке кода. В конце концов вы не на Хаскелл переходите, и даже не на F#, а на язык, который на основе плюсов был создан. Если после перехода вы все же скажете, что выбросили все знания на помойку, то видимо их и не особо много было.
    Конечно, есть стандартная библиотека .net, CLR и прочие платформенные вещи, но в современных реалиях и так приходится постоянно что-то новое учить. После бума джаваскрипта в последние 5 лет отрекаться от этого факта бессмысленно.
    Ответ написан
    Комментировать
  • Как сделать звук в программе на си/си++?

    Nipheris
    @Nipheris Куратор тега C++
    DirectSound крайне не советую, очень старое API, на висте и выше уже в режиме совместимости работает, вот OpenAL можно, если на винде - то XAudio2 или даже ASIO, в зависимости от целей (игры vs софт для обработки звука) и "глубины погружения".
    Ответ написан
    Комментировать