• Есть ли способ получать предупреждение при преобразовании char в int?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    char ToChar(int val)
    {
        if(static_cast<unsigned>(val) <= 255)  // better to use std::numeric_limits<unsigned char>::max() instead of 255
        {
            return static_cast<char>(val);
        }
        else 
        {
            throw "trying to convert int to char with loosing of data"; // better to throw some another exception from the lib #include <stdexcept>
        }
    }


    код написан на коленке, могут быть синтаксические оишбки
    Ответ написан
    Комментировать
  • Почему в Unity я хожу на A вправо, на d в лево, на w назад, на s вперед?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    Vector3 moveDir = -new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized;
                      ^ вы уверены что вам нужен тут минус?
    Ответ написан
    Комментировать
  • Почему линкер возврашает ошибку при компиляции hello_world?

    by_kapt0xa
    @by_kapt0xa Автор вопроса
    Учу кресты катаюсь на велике
    я удалил mingw и поставил LLVM
    вместо g++ использую clang
    очень важно чтобы при вызове clang вызывался именно clang из папки LLVM а не из папки mingw
    я переустановил mingw, через установщик. до этого устанавливал, васпаковывая архив, получилось так себе.
    Ответ написан
    Комментировать
  • Как упростить проверку на правильность круглых скобок?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    попробуй это
    #include <iostream>
    #include <cassert>
    
    using namespace std;
    
    int main()
    {
    	string input;
    	cin >> input;
    	int unclosed_count = 0;
    	for (char c : input)
    	{
    		if (c == '(')
    		{
    			++unclosed_count;
    		}	
    		else if (c == ')')
    		{
    			--unclosed_count;
    			assert(unclosed_count >= 0);//не знаю как надо реагировать на неправильные скобки, но вот тут нужно отслеживать корректность.
    		}
    	}
    }
    Ответ написан
  • Откуда здесь NAN?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    я при выполнении получил ошибку в 152 строке (delete[] multed;)
    возможно, вы напартичили с указателями и nan получается из мусорных значений
    вы вроде на c++ пишете, а векторами не пользуетесь
    вектора не будут давать ошибок при работе с указателями, и во время дебага отладчик показывает все содержимое вектора а не только 1 число
    все, что связанно с указателями, new, delete надо вычеркнуть из своего кода заменить это все векторами
    и матрицу лучше делать так:
    int n;
        vector<float> maxrix(n * n, 0); // так плохо
        vector<vector<float>> matrix(n, move(vector<float>(n, 0))); // так хорошо


    и еще для примера я тебе переписал функцию subtract, чтобы ты знал как это нормально делается
    vector<vector<float>>& operator -=(vector<vector<float>>& Left, const vector<vector<float>>& Right) {
        assert(Left.size() == Right.size()); // #include <cassert>
        //ассерт выполняется только в режиме дебага. он делает твой код безопаснее
        for (size_t i = 0; i < Left.size(); i++)
        {
            vector<float>& line = Left[i];//принимает по ссылке, а не по значению.
            const vector<float>& r_line = Right[i];
            assert(line.size() == r_line.size()); // #include <cassert>
            for (size_t j = 0; j < line.size(); j++)
            {
                line[j] -= r_line[j];
            }
        }
        return Left;
    }
    
    vector<vector<float>> operator -(const vector<vector<float>>& Left, const vector<vector<float>>& Right) {
        auto copy = Left;
        copy -= Right;
        return copy;
    }

    const type& - значение передается по ссылке, без копирования с запретом на изменение
    type& - значение передается по ссылке, без копирования, можно вносить изменения
    Ответ написан
  • Как удалить чужой репозиторий GitHub из списка?

    by_kapt0xa
    @by_kapt0xa Автор вопроса
    Учу кресты катаюсь на велике
    6378a2c3ed3d6714269017.png
    неприличных слов вроде на скриншоте нет, но если заметите, просьба не банить.
    Ответ написан
    Комментировать
  • Как вписать в новый массив только один новые элемент, если в старом массиве таких элементов несколько?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    ну на задачу я не могу ответить, я могу ответить на заголовок. был бы тут c++ я бы применил sort потом unique.
    или просто бы сделал бы хеш-таблицу и потом бы из хеш-таблицы обратно массив бы сделал, если прям обязательно именно массив.(но жеш-таблица не сортирует и даже еще дополнительно перемешивает, но она быстрее, особенно для больших объемов)
    предлагаю использовать Dictionary (это вроде хеш таблица и есть), а потом из нее обратно массив
    хеш-таблица это таблица "заголовок-данные", заголовок еще ключом называют. хеш таблица гарантирует что все заголовки уникальные. если в нее добавить повторяющийся заголовок, то просто старый заголовок с данными будут заменены новыми.
    есть еще HashSet, это как хэш-таблица, но там только заголовки. тоесть это не таблица а множество получается.
    Ответ написан
  • При цикле while постоянно вылетает Unity. Как исправить?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    число float хранит двоичные дроби и конечное кол-во цифр.
    например 1/3 в 10-чной записи это 0.3333333333 и так до бесконечности.
    если мы запретим хранить бескочечное кол-во цифр (комп просто так не умеет), то 1/3 будет записана с погрешностью, т.к. в десятичной записи ее невозможно так отобразить
    допустим мы говорим х = 1/3
    давайте будем скдалывать х пока не получим 1
    а мы никогда не получим 1
    мы получим 0.9999999, которая не равна 1 и пойдем дальше
    аналогично с двоичной системой исчисления, 1/5, 1/10 не возможно выразить за 23 цифры, а float хранит только 23 двоичные цифры (double - 53 цифры)
    но даже если у тебя не будет арифметической погрешности, ловить точное равенство это так себе. обычно условие завершения цикла это знак больше или меньше, но не точное равенство.

    ну и еще так по мелочи, я не проводил эксперимент как это на производительности сказывается, но вектор это 3 числа, а х - одно число. зачем прибавлять к вектору другой вектор, если вам достаточно к иксу добавить какую-то величину. может быть 0 прибавляется очень быстро, но даже если мы забудем про производительность, просто к иксу прибавлять число это же наверное код будет изящнее. хотя у вас читаемость кода так себе. что такое gr, что такое WH, совсем неясно. и название controll - это попытка в адекватные названия, но совсем не ясная. controll наверное относиться к управлению, но тут я не вижу никакого управления. подумайте что делает этот скрипт и вычеркните слово controll из своих мыслей. ааа это control 1. значит есть и control 2. это совсем нейминг от бога.

    !!!!! обновил:
    что кстати значит "вылетает"?
    работа программы прекращается с отчетом об ошибке?
    или просто останавливается, зависает на 0 fps
    у тебя скорее всего второе. функция update вызывается на каждом кадре, если в в update делать бесконечный цикл, то программа остановится на этом бесконечном цикле, ошибки не будет просто игра встанет (наверное, я на такие ошибки не напарывался).
    если в update поместить что-то громоздкое, то у тебя fps сильно просядет
    общая рекомендация: тебе вряд ли в скриптах нужны циклы, в юнити есть свои циклы событий.
    Ответ написан
    Комментировать
  • Как поменять код, чтобы при заполнении двумерного массива распознавалась переменная int и не запрашивало указатель?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    #include <random>
    #include <iostream>
    using namespace std;
    
    void zxc(int* arr, const int row, const int col)
    {
    
    	srand(time(NULL));
    	for (int f = 0; f < row; f++)
    	{
    		for (int j = 0; j < col; j++)
    			arr[f* col + j] = rand() % 10;
    	}
    
    }
    
    void qwe(int* arr, const int row, const int col)
    {
    
    	for (int i = 0; i < col; i++) {
    		for (int f = 0; f < row; f++)
    			cout << arr[f * col + i] << "\t";
    		cout << endl;
    	}
    }
    
    //qwe и zxc это самые удачные названия для функции, из названия сразу ясно что эти функции делают.
    
    int main()
    {
    	const int row = 5;
    	const int col = 7;
    	int arr[row * col];
    	zxc(arr, row, col);
    	qwe(arr, row, col);
    }

    программисты C++ таким не занимаются, это больше похоже на C.
    вот как выглядит нормальный код на C++:
    #include <random>
    #include <iostream>
    #include <vector>
    using namespace std;
    
    void zxc(vector<vector<int>>& arr, const int row, const int col)
    {
    	srand(time(NULL));
    	arr.resize(row);
    	for (auto& line : arr)
    	{
    		line.resize(col);
    		for (auto& x: line)
    		{
    			x = rand() % 10;
    		}
    	}
    
    }
    
    void qwe(const vector<vector<int>>& arr, const int row, const int col)
    {
    	for (const auto& line : arr)
    	{
    		for (const auto& x : line)
    		{
    			cout << x << "\t";
    		}
    		cout << endl;
    	}
    }
    
    int main()
    {
    	const int row = 5;
    	const int col = 7;
    	vector<vector<int>> arr;
    	zxc(arr, row, col);
    	qwe(arr, row, col);
    }

    простые массивы имеют массу неприятностей, связанных с НЕгибкостью кода. если вы пишете на плюсах, познакомьтесь с векторами.
    !!!!!!!!!извиняюсь, предыдущая версия была с ошибками, я отредачил
    Ответ написан
    1 комментарий
  • Как использовать Time.deltaTime в методе transform.RotateAround?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    я нажал не ту кнопку и удалил ответ. восстанавливаю:

    видос:
    https://youtu.be/QavP2SPtXQA
    код:
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class NewBehaviourScript : MonoBehaviour //дай скрипту норм назвыание а не "нью бехейвор скрипот"
    {
        void Start()
        {
            axis.Normalize();
        }
    
        [SerializeField] Vector3 axis;//ось вращения
        [SerializeField] float rotation_speed;// градусы в секунду
        void Update()//если update или late update, то используйте deltaTime, если fixed update, то используйте fixed delta time. грубо говоря одно fixed синхронизированно с физическими событиями
        {
            transform.Rotate(axis, rotation_speed * Time.deltaTime);
        }
    }
    Ответ написан
    Комментировать
  • Как сделать вращение вокруг игрока через синус и косинус?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    я этот видос сделал для другого чувака, но думаю тебе тоже пригодится
    видос:
    https://youtu.be/QavP2SPtXQA
    код:
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class NewBehaviourScript : MonoBehaviour //дай скрипту норм назвыание а не "нью бехейвор скрипот"
    {
        void Start()
        {
            axis.Normalize();
        }
    
        [SerializeField] Vector3 axis;//ось вращения
        [SerializeField] float rotation_speed;// градусы в секунду
        void Update()//если update или late update, то используйте deltaTime, если fixed update, то используйте fixed delta time. грубо говоря одно fixed синхронизированно с физическими событиями
        {
            transform.Rotate(axis, rotation_speed * Time.deltaTime);
        }
    }


    дополнение
    спешал 4ю еще видос на 18 минут:
    https://www.youtube.com/watch?v=s0VcFiL2_RE
    код из видоса:
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class NewBehaviourScript1 : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
            gameObject.SetActive(false);
            rotation_axis.Normalize();
            rotated_sword = null;
        }
    
        [SerializeField] Transform rot_hand;
        [SerializeField] Transform usual_hand;
        [SerializeField] float rotation_speed;
        [SerializeField] Vector3 rotation_axis;
        Transform rotated_sword;
        [SerializeField] Transform current_sword;
    
        public void RotateSword()
        {
            RotateSword(current_sword);
        }
    
        void RotateSword(Transform sword)
        {
            Debug.Assert(rotated_sword == null);
            gameObject.SetActive(true);
            rotated_sword = sword;
            sword.parent = rot_hand;
            sword.localPosition = new Vector3(0, 0, 0);
            sword.localRotation = new Quaternion(0, 0, 0, 1);
    
        }
    
        public void StopRotatingSword()
        {
            Debug.Assert(rotated_sword != null);
            rotated_sword.parent = usual_hand;
            rotated_sword.localPosition = new Vector3(0, 0, 0);
            rotated_sword.localRotation = new Quaternion(0, 0, 0, 1);
            rotated_sword = null;
            gameObject.SetActive(false);
        }
    
        public bool IsRotatingSword()
        {
            return rotated_sword != null;
        }
    
        void FixedUpdate()
        {
            transform.Rotate(rotation_axis, rotation_speed * Time.fixedDeltaTime);
        }
    }
    Ответ написан
    Комментировать
  • Правильно ли я написал программу?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    не очень ясно какой кусок кода надо вынести в отдельную функцию. стоит выделить комментариями начало и конец куска кода. но вот я что-то сделал. переменную value я переименова в procedure, так логичнее мне кажется
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public delegate double Func(double x);
            static void Main(string[] args)
            {
                Func procedure = function;
    
                double a, b;
                a = 0.5;
                b = 1.5;
                use_procedure_for_a_and_b(ref a, ref b, procedure);
                Console.WriteLine((a + b) / 2);
                Console.ReadLine();
            }
            static void use_procedure_for_a_and_b(ref double a, ref double b, Func procedure)
            {
                const double e = 0.001;
                while (Math.Abs(b - a) > 2 * e)
                {
                    double c = (a + b) / 2;
                    if (procedure(b) * procedure(c) < 0)
                    {
                        a = c;
                    }
                    else
                    {
                        b = c;
                    }
                }
            }
            static double function(double x)
            {
                double tmp = Math.Pow(2, 0.5);
                return 4 * Math.Sin(3 * x - 1) - Math.Pow(x, tmp) + 1;
            }
        }
    }
    Ответ написан
    Комментировать
  • Как сделать подбор предметов на кнопку?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    преддположу что ты пишешь игру на юнити, управление - клавомышь, надо подойти к предмету и нажать E чтобы он попал в твой инвентарь
    прикрепи к персонажу область-триггер, стелай скрипт, где ты будешь через onTriggerStay отслеживать что валяется рядом с персонажем и если ты нажмешь кнопку, то это все надо подобрать.
    нажатие кнопки отслеживай через обработку нажания клавиатуры
    можно посмотреть цикл событий в юнити и решить, где ты будешь отслеживать нажатие кнопки, где ты будешь отслеживать отпускание кнопки
    например
    bool key_pressed;
    void Update()
    {
        key_pressed = Input.GetKeyDown(...);
    }
    void OnTriggerStay(Collider other)
    {
        if(otrer - это не подбираемый предмет)
        {
              return;
        }
    
        if(key pressed)
        {
              забрать предмет в инвентарь;
        }
    }
    Ответ написан
    Комментировать
  • Значение типа нельзя использовать для, инициализации сущности типа linked_list?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    !!! посмотри конец сообщения

    маллок возращает void*, нужно явно преобразовать в linked_list*
    я бы написал (linked_list*)..., но то ли умные, то ли занудные дяди говорят что надо писать static_cast<linked_list*>(...)
    struct linked_list* list =               malloc(sizeof * list); // подчеркивает красным
    struct linked_list* list = (linked_list*)malloc(sizeof * list); //не подчеркивает красным


    у меня на сегодня исчерпан лимит на ответы, я отвечу ререз редактирование сообщения:
    https://www.youtube.com/watch?v=1i4nVpIQN0U

    если использовать не malloc и free, а new и delete, то тип данных будет не void*, а сразу нужный.
    но new и delete это c++.
    вы скорее всего используете C для заданий в универе, но если вам разрешают пользоваться C++, я бы рекомендовал его, там более приятный синтаксис, хотя мне по началу не было понятно как работает cout, но когда я разобрался, я перешел на сторону c++.
    извиняюсь что быканул за C, я сам новичок на форуме, не уверен что C вынесен в отдельную категорию, просто у вас указан с++
    Ответ написан
    3 комментария
  • Можно ли вызвать деструктор void*?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    нет, нужен полиморфизм
    попробуйте почитать про std::variant
    допустим, вы собираетессь хранить там не все что угодно, а только double, string и bool
    тогда надо написать
    using polimorf_ptr = variant<double*, string*, bool*>;
    vector<polimorf_ptr> ...; // получается у вас не void*, а polimorf_ptr


    !!!!1 обновил:
    попробуй использовать PolimorfPtr вместо void*. я на коленке сделал, возможно тебе идея понравится и ты доработаешь:
    void no_destructor(void*) {}
    
    struct PolimorfPtr
    {
    public:
    	PolimorfPtr()
    		: ptr(nullptr) //надеюсь, ты шаришь за двоеточие
    	{}
    	PolimorfPtr(const PolimorfPtr&) = delete;
    	PolimorfPtr(PolimorfPtr&& other) //надеюсь, ны знаешь что такое r-value - ссылка
    		:ptr(other.ptr),
    		destructor(other.destructor)
    	{
    		other.ptr = nullptr;
    		other.destructor = no_destructor;
    	}
    	//мне лень писать оператор =, оператор *, -> и вот это вот все, надеюсь ты знаешь зачем нужны эти операторы и понимаешь о чем я
    
    	PolimorfPtr(void* pointer, void destructor_calling_function(void*) = no_destructor)
    		: ptr(pointer),
    		destructor(destructor_calling_function)
    	{}
    
    	void* ptr; //====================================================== тут хранится указатель
    	void (*destructor)(void*) = no_destructor; //===========тут хранится указатель на деструктор (на функцию, которая вызывает деструктор)
    
    	~PolimorfPtr()
    	{
    		destructor(ptr);
    		ptr = nullptr;
    		destructor = no_destructor;
    	}
    };

    сори за коментарии для маленьких, я не знаю уровень твоего знания с++, возможно ты с этим уже знаком
    Ответ написан
  • Как сделать метод деления пополам?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    1) прошагать с мелким шагом найти где функция меняет знак
    2) в каждом диапазоне где функция меняет знак найти корень
    2.1) если функция при изменении знака очень разко меняет значение (оценка производной слишком большая), то это не пересечения нуля, а разрыв.

    такой алгоритм не гарантирует корректное решение.

    #define _USE_MATH_DEFINES
    #include <iostream>
    #include <vector>
    #include <optional>
    #include <cmath>
    #include <cassert>
    using namespace std;
    
    double f(double x)
    {
    	return x * x * x * (cosh(x)) + M_PI - 9 * M_PI * x;// (e^x+e^-x)/2 это "гиперболический косинус" aka "чосинус"
    }
    
    bool has_different_signs(double a, double b)
    {
    	return (a > 0) != (b > 0);
    }
    
    vector<pair<double, double>> find_sign_shanges(double from, double to, double step, double function(double))
    {
    	assert(from < to);
    	assert(step > 0);
    
    	vector<pair<double, double>> result;
    
    	double last_val = function(from);
    	double last_x = from;
    	from += step;
    	for (; from < to; last_x = from, from += step)
    	{
    		double current_val = function(from);
    		if (has_different_signs(current_val, last_val))
    		{
    			result.push_back({last_x, from});
    		}
    		last_val = current_val;
    		last_x = from;
    	}
    	return result;
    }
    
    optional<double> find_root_binary(double from, double to, double function(double), double precision, double slope_limit = +INFINITY)
    {
    	double y1 = function(from);
    	double y2 = function(to);
    	assert(from <= to); // не уверен что это нужно
    	assert(has_different_signs(y1, y2));
    	assert(slope_limit > 0);
    	assert(precision > 0);
    
    	double slope = (y2 - y1) / (to - from);
    	if (abs(slope) >= slope_limit)
    	{
    		return nullopt; // если угол наклона граффика очень боьшой, кторее всего знак меняется не через 0, а через разрыв
    	}
    
    	double middle_x = (from + to) / 2;
    	double middle_y = function(middle_x);
    	if (abs(middle_y) < precision)
    	{
    		return middle_x;
    	}
    	if (has_different_signs(middle_y, y1))
    	{
    		return find_root_binary(from, middle_x, function, slope_limit);
    	}
    	else
    	{
    		return (find_root_binary(middle_x, to, function, slope_limit));
    	}
    }
    
    vector<double> find_roots(double from, double to, double function(double), double precision, double step = 0.1)
    {
    	assert(precision > 0);
    	auto sign_shanges = find_sign_shanges(from, to, step, function);
    	vector<double> result;
    	for (auto [from_mini, to_mini] : sign_shanges) // нужен c++ 17 или более поздняя версия вроде бы как для такого синтаксиса
    	{
    		auto root = find_root_binary(from_mini, to_mini, function, precision);
    		if (root)
    		{
    			result.push_back(*root);
    		}
    	}
    	return result;
    }
    
    int main()
    {
    	auto roots = find_roots(-10, +10, f, 0.0000001);
    	for (double root : roots)
    	{
    		cout << root << endl;
    	}
    	return 0;
    }
    Ответ написан
    Комментировать
  • Как исправить Error C4700: использована неинициализированная локальная переменная "x"?

    by_kapt0xa
    @by_kapt0xa
    Учу кресты катаюсь на велике
    чтобы код не искажался, используйте кнопку для вставки кода (см. прикрепленное изображение)
    просто у вас пропало то, что находится в угловых скобках

    попробуйте вот так:
    float y = 0, x = 0, t = 0, z = 0, k = 0;//при создании задавайте значение поумолчанию


    или так так:
    float y, x = 0, t = 0, z, k;

    с++ не задает переменным значение по умолчанию, если это не структура или класс с конструктором (я упрощаю)
    в переменной будет записан какой-то мусор, оставшийся от работы компьютера.

    6375b2975432d407708901.png
    Ответ написан
    Комментировать