• Можно ли вызвать деструктор void*?

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

    Павел Соколов, тебе нужно будет изобрести указатель на тип данных, указатель на тип данных будет содержать указатели на деструктор, а так же на другие вещи которые можно сделать с типом данных
  • Можно ли вызвать деструктор void*?

    Павел Соколов, прояви изобретательность, для того чтобы сделать из крестов питон, надо к указателю прикрепить записку "это кот вася, кормить 3 раза в неделю элитным лососем" и все. указатель на деструктор - это записка о том, что делатиь при смерти кота. осталось прикрепить записку как кормить кота, как кот мяукает, и вообще записки на все случаи жизни, а то неясно вообще что ты будешь делать с указателем на что-то.
    у меня например комп не знал как открывать .bsg файлы, пока я ему ручками не указал что открывать блокнотом. волшебной палочки не бывает, пока ты ручками не познакомишь комп с каким-то объектом, он не знает как с этим объектом обращаться. (.bsg - файл это файл сохранения из одной игры)
  • Можно ли вызвать деструктор void*?

    Павел Соколов, а в чем тогда смысл варианта, если он недописан? что значит "я не уверен", читай документацию, если конечно собираешься использовать вариант
  • Можно ли вызвать деструктор void*?

    Павел Соколов, ало сделай прослойку
    void string_destructor(void* ptr)
    {
    delete (string*)ptr;
    }
    и указывай прослойку в качестве деструктора
  • Можно ли вызвать деструктор void*?

    Павел Соколов, в любом случае вам к указателю надо как-то прикреплять пометку о том, как воспринимать этот указатель. ну например указатель на объект и указатель на функцию, которая вызывает деструктор.
    просто указатели на функцию - такое бывает, а указатели на тип данных - такого не бывает. но вы спрашивали про деструктор, возможно с остальным у вас все пучком.
  • Можно ли вызвать деструктор void*?

    Павел Соколов, нет, с++ - язык со статической типизацией, нельзя взять и разрешить использовать что угодно. variant позволяет перечислить и подготовить ваш код к определенный типам данных
    можно попробовать изобрести велосипед, но пока вы напишете велосипед, у вас получится баганный, лаганный Python--, а не C++
    используйте сразу питон, не изобретайте велосипед
    хотя возможно велосипед не будет столь масштабным, как питон.
  • Как правильно получить угол из вектора направленного вниз?

    слишком абстрактно сформулирован вопрос, неясно как ответить
    попробуйте скачать OBS и сопровождать вопрос видосом, для юнити так иногда проще
  • Значение типа нельзя использовать для, инициализации сущности типа linked_list?

    XRFD, кста, я разобрался и категория C без плюсов есть.так что, если это C++, то лучше использовать не malloc/free, а new/delete, не stdio.h, а iostream, если понадобятся динамические массивы (это когда заранее неясно какого они размера) использовать vector.
    для каждой библиотеки .h есть модернизированный, более удобный и функциональный анлог от c++.
    new был бы удобен тем, что выдавал бы сразу указатель нужного типа
  • Как сделать подбор предметов на кнопку?

    управление клавомышь? ты кликаешь на предмет или подходишь к предмету и нажимаешь E чтобы подобрать?
    ты в юнити пишешь игру или c# + графическая библиотека?
  • Значение типа нельзя использовать для, инициализации сущности типа linked_list?

    я не уверен, но мне кажется это некорректро:
    struct linked_list* list = ...;
    слово struct лишнее.
    вот это норм, тут слово struct уместно:
    struct <название структуры>
    {
        <описание структуры>
    }

    а вот тут оно мне кажется подозрительным, я так никогда не писал и когда меня учили програмированию, я такого не видел:
    struct <название типа> <название переменной>;
  • Значение типа нельзя использовать для, инициализации сущности типа linked_list?

    я обычно пишу коментарий на какой строчке ошибка (где visual studio мне красным подчеркивает, там я и пишу коментарий)
  • Как перевести это с C++ на C#?

    by_kapt0xa
    @by_kapt0xa Автор вопроса
    ок ладно надо будет просто заняться азами шарпа, разобраться что такое ссылочный, что такое значимый тип, как они работают и т.д.
  • Как перевести это с C++ на C#?

    by_kapt0xa
    @by_kapt0xa Автор вопроса
    Роман,
    хочу реализовать структуру для marching cubes (https://youtu.be/M3iI2l0ltbE?t=94)
    структура будет хранить в себе информацию о 8 точках, есть там вещество или нет.
    есть 14 различных ситуаций, которые путем вращения и зеркального отражения и инверсии можно преобразовать во все 256 ситуаций
    у куба 8 вершин и мне нужно 8 булов для каждой из вершин.
    я решил 8 булов хранить в 1 байте, кроме того для вращения и зеркального отражения я хочу использовать побитовые операции.
    я хочу именно значимый, не ссылочный тип данных.
    в процессе написания несколько раз возникло желание использовать chain-setter, но как я понял для структур это нельзя сделать.

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MarchingCubesMeshes
    {
        struct _8Bools
        {
            public _8Bools(byte val)
            {
                data = val;
            }
    
            public _8Bools(bool all_vals)
            {
                data = (byte)(all_vals ? 0xff : 0x00);
            }
    
            public byte data;
    
            public bool this[byte pos]
            {
                get
                {
                    Debug.Assert(pos< 8);
                    return ((1 << pos) & data) != 0;
                }
                set
                {
                    Debug.Assert(pos < 8);
                    if (value)
                    {
                        data |= (byte)(1 << pos);
                    }
                    else
                    {
                        data &= (byte)~(1 << pos);
                    }
                }
            }
    
            public void invert_bit(byte pos)
            {
                Debug.Assert(pos < 8);
                data ^= (byte)(1 << data);
            }
    
            public _8Bools extract_part(byte from, byte count)
            {
                Debug.Assert(from <= 8);
                Debug.Assert(count <= 8);
                Debug.Assert(from + count <= 8);
                byte mask = (byte)((0xff >> count) << from);
                _8Bools result = this;
                result.data ^= mask;
                return result;
            }
    
            public _8Bools with_inverted_bit(byte pos)
            {
                _8Bools copy = this;
                copy.invert_bit(pos);
                return copy;
            }
    
            public void mirror(byte dimention)
            {
                Debug.Assert(dimention < 3);
                _8Bools mirrored_bits = new _8Bools(false);
                for(_8Bools i = 0; i.data < 8; ++i.data)
                {
                    if(mirrored_bits[i.data])
                    {
                        continue;
                    }
                    _8Bools alter_i = i.with_inverted_bit(dimention);// тут я хотел написать " _8Bools alter_i = new _8Bools(i).invert_bit(dimention)" но метод возвращал void, а значит комбинация из конструктора копирования и метода не может стоять справа от знака =
                    bool ith_bit = this[i.data];
                    this[i.data] = this[alter_i.data];
                    this[alter_i.data] = ith_bit;
                    mirrored_bits[i.data] = true;
                    mirrored_bits[alter_i.data] = true;
                }
            }
    
            public void rotate(byte axis_dimention)
            {
                //z = axis_dimention;
                byte x = (byte)((axis_dimention + 1) % 3);
                byte z = (byte)((axis_dimention + 1) % 3);
                _8Bools rotated_bits = new _8Bools(false);
    
            }
    
            public static implicit operator _8Bools(byte initial_data)
            {
                return new _8Bools(initial_data);
            }
        }
    
    }
  • Как перевести это с C++ на C#?

    by_kapt0xa
    @by_kapt0xa Автор вопроса
    а для структуры это можно сделать?
  • Как перевести это с C++ на C#?

    by_kapt0xa
    @by_kapt0xa Автор вопроса
    Александр Ананьев,
    ок, вот другой пример использования. когда используется не совсем сеттер, просто метод, который как-либо влияет на объект, и после этого влияния можно сразу же обратиться к этому же объекту.
    // внизу быдет отмечена строчка, на которую надо обратить внимание. ===================
    #include <iostream>
    #include <random>
    #include <stdexcept>
    
    using namespace std;
    
    class human
    {
    public:
        enum class Gender_t
        {
            male,
            female,
            other
        };
    
    private:
        string name_;
        int birth_year_; 
        Gender_t gender_;
        string about_me_ = "";
        bool is_invalid_ = false;
        bool is_alive_ = true;
    
    public:
        human& set_name(string val)
        {
            name_ = val;
            return *this;
        }
    
        human& set_birth_year(int val)
        {
            birth_year_ = val;
            return *this;
        }
    
        human& set_gender(Gender_t val)
        {
            gender_ = val;
            return *this;
        }
    
        human& set_about_me(string val)
        {
            about_me_ = val;
            return *this;
        }
    
        const string& get_name() const
        {
            return name_;
        }
    
        int get_age(int current_year) const
        {
            return current_year - birth_year_;
        }
    
        const Gender_t& get_gender() const
        {
            return gender_;
        }
    
        const string& get_about_me() const
        {
            return about_me_;
        }
    
        bool is_usefull()
        {
            return is_alive_ && (!is_invalid_);
        }
    
        human& go_to_war()
        {
            if (!is_usefull())
            {
                throw logic_error(name_ + " cant go to war");
            }
            switch (rand() % 3)
            {
            case 1:
                cout << "rip " << name_ << endl;
                is_alive_ = false;
                break;
            case 2:
                cout << name_ << " screams: \"I DONT FEEL MY LEG! HEEEEELP! KILL ME!\"" << endl;
                is_invalid_ = true;
                break;
            default:
                cout << "tra-ta-ta-ta-ta, BOOOOOOOM" << endl;
                break;
            }
            return *this;
        }
    };
    
    int main() 
    {
        human ivan;
        ivan.set_name("ivan")
            .set_birth_year(1999)
            .set_gender(human::Gender_t::male);
        cout << "name: " << ivan.get_name() << "\n"
            << "age: " << ivan.get_age(2022) << endl;
        if (ivan.go_to_war().is_usefull()) // вот тут =======================================================
        {
            cout << ivan.get_name() << " can work and pay taxes" << endl;
        }
        else
        {
            cout << ivan.get_name() << " cant work and pay taxes" << endl;
        }
    }
  • Как перевести это с C++ на C#?

    by_kapt0xa
    @by_kapt0xa Автор вопроса
    GavriKos,
    ну например
    // точка входа в программу почти в самом низу ==========================
    #include <iostream>
    
    using namespace std;
    
    class human
    {
    public:
        enum class Gender_t
        {
            male,
            female,
            other
        };
    
    private:
        string name_;
        int birth_year_; 
        Gender_t gender_;
        string about_me_ = "";
    
    public:
        human& set_name(string val)
        {
            name_ = val;
            return *this;
        }
    
        human& set_birth_year(int val)
        {
            birth_year_ = val;
            return *this;
        }
    
        human& set_gender(Gender_t val)
        {
            gender_ = val;
            return *this;
        }
    
        human& set_about_me(string val)
        {
            about_me_ = val;
            return *this;
        }
    
        const string& get_name() const
        {
            return name_;
        }
    
        int get_age(int current_year) const
        {
            return current_year - birth_year_;
        }
    
        const Gender_t& get_gender() const
        {
            return gender_;
        }
    
        const string& get_about_me() const
        {
            return about_me_;
        }
    };
    
    int main() // ================================================================ точка входа
    {
        human ivan;
        ivan.set_name("ivan")
            .set_birth_year(1999)
            .set_gender(human::Gender_t::male);//мы сразу несколько сеттеров пишем к одному объекту, т.к. каждый сеттер возвращает ивана, то после сеттера к этой надписи можно добавить еще один сеттер, иван останется иваном, а не превратится в void
        cout << "name: " << ivan.get_name() << "\n"
            << "age: " << ivan.get_age(2022) << "\n";
        //распечатку enum чутка сложнее делать
    }


    выводит на экран:

    name: ivan
    age: 23

    постфикс '&' в C++ играет аналогичную роль как префикс 'ref' в C#, если я правильно понимаю
  • Как перевести это с C++ на C#?

    by_kapt0xa
    @by_kapt0xa Автор вопроса
    или это не переводится на C#?
  • Как упростить синтаксис вызова конструктора в c#?

    by_kapt0xa
    @by_kapt0xa Автор вопроса
    вроде можно сделать оператор преобразования одного типа в другой, но мне как cpp-шнику кажется странным, что конструктор не воспринимается как оператор преобразования.