Ответы пользователя по тегу C++
  • Как портировали игры с PC на Xbox 360 и PS 3?

    15432
    @15432
    Системный программист ^_^
    Переделывать много не нужно, если игра изначально делалась кросплатформенная. Только перекомпилировать, учитывая нюансы конкретного процессора. Например, вся логика игры от процессора вообще не зависит, операции сложения и сравнения в любом проце будут. Особенности возникают разве что на этапе рендеринга, да отображения на экране.
    Не знаю как Sony, но Microsoft предоставляет полноценную среду разработки и компилирования, а также специальную версию игровой приставки с кучей возможностей для отладки самой игры (XDK, Xbox Development Kit, у меня тож есть).
    Ответ написан
  • Куда устанавливается Microsoft Visual C++?

    15432
    @15432
    Системный программист ^_^
    Visual C++ Redistributables это всего лишь набор DLL файлов, необходимых для корректного функционирования софта, разработанного в этой Visual Studio. Копируются, к примеру, в C:\Windows\System32\msvcrt110.dll (все прочие аналогично)
    Удалять не рекомендую - сами они не запустятся, для других программ могут быть критичны, места много не занимают (порядка 50 МБ каждый пак)
    Ответ написан
    1 комментарий
  • Заполнить двумерный массив рандомными числами и вывести их сумму?

    15432
    @15432
    Системный программист ^_^
    неправильно вот это
    cout << mas[i][j] << endl;

    его нужно вставить внутрь цикла по j

    в остальном выглядит норм.
    не очень понятно, для чего прибавлять 0
    Ответ написан
    2 комментария
  • Почему программа зацикливается если ввести большое число?

    15432
    @15432
    Системный программист ^_^
    В коде отсутствует обработка некорректного ввода. Он точно так же зациклится, если вы введёте букву. Необходимо добавить очистку stdin в случае невозможности распарсить вход как int
    Ответ написан
    1 комментарий
  • Что есть в C++, чего нет в C#?

    15432
    @15432
    Системный программист ^_^
    На C/C++ можно написать системный драйвер или микропрограмму для железки.
    В C/C++ есть union
    В коде на C/C++ можно использовать ассемблерные вставки

    Как уже писали, из-за близости языка к ассемблеру и машинному коду, упрощается работа с структурами данных и указателями, отсутствуют проверки и прослойки, само исполнение кода производится быстрее. Не требуется наличие .NET Framework, можно создать программу, не требующую вообще никаких дополнительных библиотек и ПО.
    Ответ написан
  • Почему не получается передать указатель в функцию?

    15432
    @15432
    Системный программист ^_^
    Вы забыли выделить память и поместить указатель на выделенную область в ptr

    Перед вызовом function1 добавьте

    ptr = new int[size]
    Ответ написан
    Комментировать
  • Выдает ошибку на этапе выполнения. Почему?

    15432
    @15432
    Системный программист ^_^
    Потому что у вас в массиве зарезервировано всего 44 места (0...43), а вы используете 45 (0...44)
    Ответ написан
    Комментировать
  • Как узнать какие функции доступны в dll?

    15432
    @15432
    Системный программист ^_^
    Открываю IDA и смотрю что за функции торчат наружу, какие параметры принимают и что делают))
    Ответ написан
    8 комментариев
  • Какова практика программирования максимально совместимых приложений под Windows?

    15432
    @15432
    Системный программист ^_^
    Совместимо всё, выбирайте статическую линковку (свойства проекта - C++ - Code Generation - Runtime Library - Multi-thread)

    Вот для примера моя программка для "усреднения" почти одинаковых файлов, позапускайте от XP до десятки

    rgho.st/6bfgtjnXl
    Ответ написан
    1 комментарий
  • Как сделать программу-фильтр для потока видео?

    15432
    @15432
    Системный программист ^_^
    Плагин для AviSynth сделайте. В .avs скрипте будет указан входящий видеопоток, и ваш плагин как его обработчик. В самом плагине уже потребуется обнаружить на кадре забор и размыть его, причем потребуется временная стабильность и много других сложностей. Я пару лет пилил плагин для исправления криво поставленной стереокамеры (исправление геометрических артефактов 3D фильмов), все это приходилось решать.

    OpenCV вам правильно советуют
    Ответ написан
    Комментировать
  • Работа с сокетами средствами c++?

    15432
    @15432
    Системный программист ^_^
    Перед main

    #pragma comment(lib, "Ws2_32.lib")

    в начале кода

    WSADATA wsaData;
    WORD wVersionRequested = MAKEWORD(2, 2);
    WSAStartup(wVersionRequested, &wsaData);
    Ответ написан
    6 комментариев
  • Как работает эта программа, определяющая порядок байтов в компьютере?

    15432
    @15432
    Системный программист ^_^
    Создаётся переменная типа unsigned short int, которая почти во всех современных компиляторах имеет размер 2 байта. Затем ей присваивается значение 1. В случае архитектуры Little Endian, единица запишется в младший байт переменной, а в случае Big Endian - в старший байт. Дальше именно это и проверяется - конструкция *((unsigned char *) &x) получает значение младшего байта переменной. Если там оказался ноль, значит архитектура Big Endian.

    Код, делающий то же самое, но проверяющий старший байт:
    #include <stdio.h>
    unsigned short x = 1; /* 0x0001 */
    int main(void)
    {
      printf("%s\n", *((unsigned char *) &x + 1) == 0 ? "little-endian" : "big-endian");
      return 0;
    }
    Ответ написан
    Комментировать
  • Как добиться true в EOF?

    15432
    @15432
    Системный программист ^_^
    Например, функция fgetc() считывает символ из файла. При успешном чтении, возвращается значение от 0 до 255 (считанный символ), если достигнут конец файла, функция вернёт -1 (EOF).

    При каком условии в цикле или функции будет конец файла?

    При условии, что была произведена попытка чтения из файла, но конец файла уже был достигнут.
    Ответ написан
  • Почему не создают компьютеры с машинным языком на C/C++?

    15432
    @15432
    Системный программист ^_^
    Процессор это тупая железяка из транзисторов. Ну ладно, не настолько тупая, в современных x86 процессорах машинные коды на лету транслируются в еще более низкий уровень встроенным микрокодом. Но все все равно предположим, что это тупая железяка типа Intel 8086. Как происходит выполнение программы - процессор считывает очередной байт кода и смотрит, что же он такое считал. По значению байта, он определяет, что это за команда (сложение, вычитание) и сколько ещё нужно считать байт конкретно этого машинного слова (а они в x86 могут быть разной длины). Все это происходит на уровне железа, то есть нечто вроде "пятый бит 0, третий бит 1, ага! Это команда сложения двух восьмибитных регистров, надо переключить линию данных на арифметико-логическое устройство и считать туда еще два байта на шину данных. То есть операции очень и очень простые, на уровне бит, сигналов и чтения данных, никакого анализа кода и уж тем более никаких имен переменных. Вы же предлагаете на аппаратном уровне парсить сишный код, в котором при последовательном чтении иногда невозможно определить, что делать в данный момент!! А процессор в это время будет простаивать и считывать из памяти кучу ненужного текста.
    Я вообще не представляю, как на уровне железа и транзисторов можно сделать синтаксический и лексический анализ сишного файла. Разве что сделать настоящий электронный мозг с миллиардом нейронов. Это уж точно не будет быстро, это вообще работать не будет. Изучите устройство компьютера, как именно работает процессор, научитесь думать на языке ассемблера, и поймёте всю абсурдность вашего предложения.
    Ответ написан
    4 комментария
  • Как поймать событие epoll connect в неблокированном режиме?

    15432
    @15432
    Системный программист ^_^
    Я по EPOLLOUT ловлю.
    Ответ написан
    Комментировать
  • Почему в C++ указатели так себя ведут?

    15432
    @15432
    Системный программист ^_^
    int *aaa; //переменная с именем aaa типа "указатель на int", расположена в некоторой ячейке памяти, выделенной на стеке
        aaa = new int(6);  //присваиваем переменной aaa новое значение, а именно, адрес выделенной ячейки памяти в куче, содержащей значение 6
        qInfo() << aaa;       // 0x6a4e50   <- узнать тот самый адрес, что мы присвоили указателю
        qInfo() << *aaa;      // 6          <- перейти по этому адресу и извлечь значение 
        qInfo() << &aaa;      // 0x28fbe8   <- адрес ячейки, где лежит значение самой переменной aaa
        qInfo() << &*aaa;     // 0x6a4e50   <- перешли по указателю, который лежит в aaa (ячейка в куче, содержащая значение 6), потом узнали адрес этой ячейки, и конечно это тот самый адрес, по которому мы перешли
        qInfo() << *&aaa;     // 0x6a4e50   <- узнали адрес ячейки стека, по которому расположена переменная aaa, потом перешли по нему и извлекли значение переменной aaa. то же самое, что и просто обратиться к aaa
        qInfo() << *&*&*aaa;  // 6 тож самое что и выше, все &* нивелируют друг друга (переход по адресу и опять получение того же самого адреса обратно), остаётся только *aaa, ну а там лежит 6
    Ответ написан
    2 комментария
  • Где создается копия объекта возвращаемая функцией?

    15432
    @15432
    Системный программист ^_^
    Вот здесь всё зависит от разработчиков компиляторов!

    Конкретно ваш пример скомпилировался в очень простой вариант, где функция возвращает int, который затем присваивается и всё.

    Я чуть усложнил задачу компилятору, чтобы он не смог сделать оптимизацию:

    class samp {
    public:
      int a;
      int b[0x100];
    };
    
    samp func() //Функция возвращающая локальный объект
    {
      samp ob2;
      ob2.a=255;
      for (int i = 0; i < 0x100; i++)
      {
          ob2.b[i] = i;
      }
      return ob2;
    }


    Что получилось после компиляции в MS Visual Studio 2008 (мой основной инструмент):
    для чистоты эксперимента - Debug версия, без оптимизаций
    samp * func(samp * result_ptr)
    {
      samp ob2;
      ob2.a=255;
      for (int i = 0; i < 0x100; i++)
      {
          ob2.b[i] = i;
      }
      memcpy(result_ptr, &ob2, sizeof(samp));
      return result_ptr;
    }
    
    int main()
    {
        samp ob1;
        samp result;
        samp temp;
        samp * retval;
        retval = func(&result);
        memcpy(&temp, retval, sizeof(samp));
        memcpy(&ob1, &temp, sizeof(samp));
        return 0;
    }


    как можно видеть, место под результат выделяется ещё до вызова функции, в области стека функции main, поэтому проблем не возникает.
    Для более сложных классов с конструкторами и деструкторами будет ещё большая жесть.

    P.S. samp? san andreas multiplayer?
    Ответ написан
    2 комментария
  • А как реализуют всякие разархировщики файлов игр для модификаций?

    15432
    @15432
    Системный программист ^_^
    Зачастую применяется дизассемблинг игры, чтоб вытащить нужные алгоритмы для перепаковки.
    Бывает, что 7zip справляется
    Ответ написан
  • Где взять готовые графические решения для разработки приложения на WinAPI?

    15432
    @15432
    Системный программист ^_^
    графическое оформление с Windows 95 просто режет глаза

    добавьте в начало мейна
    #pragma comment(linker,"\"/manifestdependency:type='win32' \
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
    processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'\"")


    в качестве {не очень хорошего в плане кода} примера прилагаю свой эксперимент по созданию WinApi Dialog-based приложения минимального размера (без стандартных либ)
    rgho.st/private/7YGwG8DYs/0fb58d3c3f9767de3370ed9d...
    (есть drag-n-drop, progressbar, многопоточность, работа с файлами, и т.д. - вам хватит))
    merc2.png
    редактор диалогов в MS VS очень даже неплохой.
    Ответ написан
    Комментировать
  • Существуют ли правила подключения include-файлов в С++?

    15432
    @15432
    Системный программист ^_^
    Я в проектах делаю так:
    • в шапке .h файла #pragma once
    • в .h файле только описание класса - члены, методы, иногда структуры
    • инклюдим в .h другие .h только если этого требует описание класса
    • всё остальное необходимое для реализации инклюдим в .cpp
    Ответ написан
    3 комментария