Ответы пользователя по тегу C++
  • Как передать по TCP несколько переменных?

    Teivaz
    @Teivaz
    Может и оверкилл, но для себя я использую формулу google protocolbuffer + boost asio = нет проблем с пересылкой структур. Только нужно идентифицировать пакеты.
    Ответ написан
    Комментировать
  • Как в MVS разрешить файловый ввод в программе?

    Teivaz
    @Teivaz
    Проблема в рабочей директории.
    В Project -> Properties -> Debugging -> Working Directory ставим $(TargetDir)
    И текущая директория при запуске будет той, где лежит исполняемый файл. Ну или можно использовать абсолютный путь.
    Ответ написан
    Комментировать
  • Wave engine или Cocos2d-X?

    Teivaz
    @Teivaz
    Кокос очень сильный движок и сейчас активно развивается
    Ответ написан
    Комментировать
  • Как найти сумму углов n-многоугольника?

    Teivaz
    @Teivaz
    Он будет выпуклым даже если один угол больше 180 градусов.
    Ответ написан
    Комментировать
  • Возможна ли разработка iOS-игры на голом OpenGL ES?

    Teivaz
    @Teivaz
    Да, возможно конечно. Я и сам таким занимаюсь сейчас для общего развития.
    www.gamedev.ru

    И если интересно, то я уже отвечал на пару вопросов о самом процессе разработки игр, вот, например
    Ответ написан
    Комментировать
  • Какого формата файлы нужно создать, чтобы написать код на С++?

    Teivaz
    @Teivaz
    Данные можно хранить в json. А чтобы парсить есть библиотеки, например lib_json.
    Ответ написан
    Комментировать
  • Как определять прозрачные области спрайта, используя маску?

    Teivaz
    @Teivaz
    Шейдером в openGL это решается элементарно.
    Передаём в шейдер обе текстуры. Из первой текстуры берём r, g, b. Потом вычисляем яркость второй текстуры в точке и в прозрачку стави один минус это значение.
    vec4 tex1 = texture2D(texture1, position);
    vec4 tex2 = texture2D(texture2, position);
    float luma2 = (tex2.r + tex2.g + tex2.b)/3.0;
    gl_FragColor = vec4(tex1.r, tex1.g, tex1.b, 1.0 - luma2);
    Ответ написан
    1 комментарий
  • Как организовать игровые циклы?

    Teivaz
    @Teivaz
    Не знаю ка обстоит дело с играми на JS, но на C++ в функцию update передаётся время с прошлого апдейта, как правило, в милисекундах. Это время удобно учитывать для перемещения объекта.
    void update(float dt)
    {
    float traveled = getSpeed() * dt + getTravaledDistance();
    setTraveledDistance(traveled);
    }

    При этом функция отрисовки и функция обновления выполняются в одном потоке (иначе нужно будет синхронизировать потоки, лочить некоторые методы и т.д.).
    А если игра вдруг подвисла, то в апдейт может прийти довольно большое значение времени и тогда игровые элементы могут сделать резкий скачок. Чтобы избавиться от этого можно обрезать максимально возможное время в главном цикле:
    // main loop
    while(!done)
    {
    float dt = getTimeSinceLastUpdate();
    dt = min(33.3, dt); // equals 30 fps
    update(dt);
    render();
    }
    Ответ написан
    Комментировать
  • Ввод NULL-значения в С++?

    Teivaz
    @Teivaz
    getch()
    Ответ написан
    Комментировать
  • Как запускать .cpp в VS раздельно?

    Teivaz
    @Teivaz
    Следует понимать что именно делает ви;уал студия когда ты просишь скомпилить проект. Три основных этапа:
    Создание единиц трансляции
    На этом этапе каждый компилируемый файл (*.cpp включённый в проект) обрабатывает препроцессор: подставляет вместо "#include" код из файлов, убирает код в блоках игнорирумых "#if", подставляет все макросы "#define" и удалит комментарии.
    Кстати есть интересный финт с препроцессором, который немногие знают:
    // words.h
    "he", 
    "she", 
    "it"

    // main.cpp
    const std::string words[] = 
    {
    #include "words.h"
    };
    
    int main(int, char**)
    {
    std::cout << words[1];
    return 0;
    }

    в результате будет
    >>> she

    Компиляция ресурсов. На данном этапе каждая единица трансляции компилируется в объектный файл с расширением ".obj".

    Линковка. Она же компоновка. Исполняемый файл начинает выполнение с точки входа. Линковщику можно задать эту точку входа. По умолчанию в консольных приложениях винды это функция "main". Линковщик начнёт с того, что пройдётся по всем объектным файлам, найдёт эту функцию и начнёт с неё создавать ".exe" файл. Потом отыщет все функции, которые используются в программе, добавит их в исполняемый файл, а вызовы их имён заменит вызовами по соответствующим адресам.

    Исходя из этого можно предложить несколько вариантов:
    Использовать комментарии для переопределения точки входа.
    Использовать препроцессор (#if #elif #else #endif).
    Использовать разные точки входа линковщика.
    Во время исполнения программы отслеживать устройство ввода (клавиатура, файл) и выполнять соответствующий участок кода.
    Ответ написан
    Комментировать
  • Как в C++ красиво реализовать множество условий?

    Teivaz
    @Teivaz
    В подобных случаях я разделяю группы условий либо на временные пременные, либо на функции.
    Например:
    bool CanConsumePoint();
    bool IsPointValid(Point pt);
    
    bool pointInsideRectangle = (pointX > rectXMin) && (pointX < rectXMax) && (pointY > rectYMin) && (pointY < rectYMax);
    bool pointTypeCompatible = (pointType == compatible) || (pointType == force);
    bool pointValid = IsPointValid(currentPoint);
    if (pointInsideRectangle && pointTypeCompatible && CanConsumePoint() && pointValid)
    {
        ...
    }

    Так каждую переменную и метод можно отдельно рассматривать и легко понять за что каждая отвечает и при необходимости разобраться с логикой каждого элемента условия не вдаваясь в подробности остальных.
    Ответ написан
    Комментировать
  • Как написать программу, циклически перебирающую набор транзакций?

    Teivaz
    @Teivaz
    Узнаю книжку Липпмана.
    В вопросе не полный текст задания.
    "Web-сайт ... содержит в каталоге первой главы копию файла Sales_item.h. Скопируйте этот файл в свой рабочий каталог. Напишите программу, циклически перебирающую набор транзакций проданных книг и отображающую их на стандартном устройстве вывода."
    Ссылка на файл заголовка битая, вот вопрос на стэк оверфлоу, там, кстати, есть и рабочая ссылка. Так что сначала было бы неплохо ознакомиться с предлагаемым кодом.
    Ответ написан
    4 комментария
  • Как можно задать размер map через консоль, чтоб не использовать const int (Алгоритм А стар)?

    Teivaz
    @Teivaz
    Для такого массива нужно выделять память в цикле, или сразу одним большим блоком, но записывать в массив указатели с шагом в строку.
    int** Allocate2dArray(int w, int h)
    {
    	int** a;
    	// сначала выделяем память под указатели на столбцы
    	a = new int*[w];
    	for (int i = 0; i < w; ++i)
    	{
    		// выделяем память под каждый столбец
    		a[i] = new int[h];
    	}
    	return a;
    }

    или так
    int** Allocate2dStraight(int w, int h)
    {
    	int** a;
    	a = new int*[w];
    	// одним махом выделяем память под все столбцы
    	*a = new int[w * h];
    	for (int i = 1; i < w; ++i)
    	{
    		// и просто раздаём адреса
    		a[i] = a[i-1] + w;
    	}
    	return a;
    }

    и удалять в обратном порядке.
    Ответ написан
    Комментировать
  • Битовая операция в C++ (n < max_n, тогда n; n == max_n, тогда 0;)

    Teivaz
    @Teivaz
    Если делать это для ускорения проверки условия, то имеет смысл когда n_max степень двойки.
    тогда максимальное значение будет выглядеть, например, так:
    0010 0000
    Любое число, которое больше чем n_max, будет иметь единицу в одном из старших разрядов.
    Тогда при наложении маски:
    1110 0000
    мы получим либо ноль (когда число меньше макисмального), либо некоторое значение (когда число больше или равно).
    Но это не имеет особого смысла, поскольку сравнение скомпилируется в две операции (если не считать перебрасывания значений из регистра в регистр) по такту каждая: вычитание из максимального значения текущего и проверка флага отрицательности результат вычитания.
    Ответ написан
    1 комментарий
  • Как передать указатель на массив в качестве аргумента функции?

    Teivaz
    @Teivaz
    Если всё-таки речь о С++, то массив можно объявить так:
    int myArray[50];
    или так:
    int* myArray = new int[50];
    ну или так:
    std::vector<int> myArray;

    И соответственно использовать в функциях так:
    void Sort(int array[50 ar]);
    Sort(myArray);

    void Sort(int* ar, unsigned int size);
    Sort(myArray, 50);

    void Sort(std::vector<int>& ar);
    Sort(myArray);
    Ответ написан
    1 комментарий
  • Как в C++ хранить объекты (либо указатели на них) в массиве (std::vector)?

    Teivaz
    @Teivaz
    А, ну и очевины вариант в стиле С
    std::vector<void*> containsAnyPtr;
    containsAnyPtr.push_back( (void*)(new MyClassOne) );
    containsAnyPtr.push_back( (void*)(new MyClassTwo) );
    containsAnyPtr.push_back( (void*)(new NotMyClass) );

    Только вопрос теперь в том, какой именно объект оттуда достанем. Пропадает строгая типизация, которая является фишкой С/С++.

    P.S.
    Можно немножко осиплюсплюсить:
    std::vector<void*> containsAnyPtr;
    containsAnyPtr.push_back( reinterpret_cast<void*>(new MyClassOne) );
    containsAnyPtr.push_back( reinterpret_cast<void*>(new MyClassTwo) );
    containsAnyPtr.push_back( reinterpret_cast<void*>(new NotMyClass) );
    Ответ написан
    1 комментарий
  • Как в C++ хранить объекты (либо указатели на них) в массиве (std::vector)?

    Teivaz
    @Teivaz
    Ну или чтобы не лезть в родственные связи можно использовать, например:
    std::vector<boost::any> containsAny
    Ответ написан
    Комментировать
  • Генерация дробного числа с заданной точностью на C++

    Teivaz
    @Teivaz
    Самый простой вариант

    #include <stdlib.h>
    
    double GetNormalizedRandomNumber(int digits)
    {
        double precision = pow(10, digits);
        assert(precision < RAND_MAX); // Precision is too high.
        double ret = rand() % precision;
        ret /= precision;
        return ret;
    }
    
    Ответ написан
    Комментировать
  • Dependent method type (C++)

    Teivaz
    @Teivaz
    Есть вариант. В смысле буст:: вариант.
    boost::variant
    Ответ написан
    Комментировать
  • Доступ к методу c++ объекта из c

    Teivaz
    @Teivaz
    Попробуй в обёртке забиндить функуцию при помощи boost::bind или std::mem_fun

    boost::bind<blah>(&blah::method, &obj);
    

    std::mem_fun<void, blah>(&blah::method);
    
    Ответ написан
    Комментировать