• Как программировать и не работать?

    RabraBabr
    @RabraBabr
    Вы что наивно представляете, что как только устроитесь на работу, так сразу как начнете по 8 часов в день код на гора выдавать? Обычный офисный рабочий день - кучу совещаний, соглосований, перекуров, кофебрейков, просто тупо ничегонеделанья, потому что кто то профакапил для тебя фронт работ, тикетов нет, подписи нужной нет, ничего нет. Иногда и до кода то не доберешься. Хотя бывают дедлайны, когда нужно еще вчера и сидишь с красными глазами до 4 утра. Обыкновенный бардак кароче.
  • Где использовать const?

    RabraBabr
    @RabraBabr
    Прям эталон говнокодинга:
    1. именуйти переменные на правильном англйском вот это вот char* marka недопустимо
    2. используйте std::string зачем вам с-стайл строки?
    3. использовать тип данных флоат для денежных едениц недопустимо
    4. глобальные константы пишите с заглавных букв
    5. хранить значения по умолчанию для инициализации класса в глобальных константах дурной тон
    6. сеттеры нарушают инкапсуляцию
    7. конструктор по умолчанию перепишите так, что бы поля класса инициализировались правильно и в нужном месте
    8. Деструктор делайте сразу всегда виртуальным. Не спрашивайте для чего просто делайте.
    9. Пользуйтесь идеологией RAII и вообще по хорошему не пользуйтесь сырыми указателями и new delete
    10. старайтесь не пользоваться конструкцией do while.

    и много, много чего еще.
  • Чем обусловлены различия в работе со строками и другими массивами?

    RabraBabr
    @RabraBabr
    В принципе std::string это относительно безопасная обертка над с-стайл строками. Что касается размещения на стэке или в динамической памяти, в реализации стрингов обычно есть юнион который либо хранит указатель на data в динамической памяти, либо если строка короткая (10-15 чаров) то ее саму.
    Что то вроде:
    spoiler
    // Short-string optimization
    
    constexpr size_t buffer_size = 16; // Slightly larger than the size of a pointer
    
    class Immutable_string {
    public:
        Immutable_string(const char* str) :
            size(strlen(str))
        {
            if (size < buffer_size)
                strcpy_s(string_buffer, buffer_size, str);
            else {
                string_ptr = new char[size + 1];
                strcpy_s(string_ptr, size + 1, str);
            }
        }
    
        ~Immutable_string()
        {
            if (size >= buffer_size)
                delete[] string_ptr;
        }
    
        const char* get_str() const
        {
            return (size < buffer_size) ? string_buffer : string_ptr;
        }
    
    private:
        // If the string is short enough, we store the string itself
        // instead of a pointer to the string.
        union {
            char* string_ptr;
            char string_buffer[buffer_size];
        };
    
        const size_t size;
    };
  • Как однозначно конвертировать цвет из RGB в HSL и обратно, получая один и тот же результат?

    RabraBabr
    @RabraBabr
    Вадим,
    Проверил. RGB надо разделить на 255. H развернуть на 360 тогда правильно будет.
  • Как однозначно конвертировать цвет из RGB в HSL и обратно, получая один и тот же результат?

    RabraBabr
    @RabraBabr
    Вот моя реализация с цветом #918151 вроде работает туда обратно (сори за говнокодинг):

    spoiler
    /******************************************************************************
    
    Welcome to GDB Online.
    GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
    C#, OCaml, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
    Code, Compile, Run and Debug online from anywhere in world.
    
    *******************************************************************************/
    #include <iostream>
    
    using namespace std;
    
    void RGB_to_HSL (double r,double g,double b, double *h,double *s,double *l)
    {
        double v;
        double m;
        double vm;
        double r2, g2, b2;
        v = max(r,g);
        v = max(v,b);
        m = min(r,g);
        m = min(m,b);
        if ((*l = (m + v) / 2.0) <= 0.0) return;
        if ((*s = vm = v - m) > 0.0) 
    	{
    		*s /= (*l <= 0.5) ? (v + m ) : (2.0 - v - m) ;
        } else
    	return;
    
    	r2 = (v - r) / vm;
        g2 = (v - g) / vm;
        b2 = (v - b) / vm;
    
        if (r == v)
    		*h = (g == m ? 5.0 + b2 : 1.0 - g2); else 
    	if (g == v)
    		*h = (b == m ? 1.0 + r2 : 3.0 - b2);
        else
    		*h = (r == m ? 3.0 + g2 : 5.0 - r2);
        *h /= 6;
    }
    
    void HSL_to_RGB (double h,double sl,double l,double *r,double *g,double *b)
    {
    	double v;
    
        v = (l <= 0.5) ? (l * (1.0 + sl)) : (l + sl - l * sl);
        if (v <= 0) 
    	{
    		*r = *g = *b = 0.0;
        } 
    	else 
    	{
    		double m;
    		double sv;
    		int sextant;
    		double fract, vsf, mid1, mid2;
    		m = l + l - v;
    		sv = (v - m ) / v;
    		h *= 6.0;
    		sextant = int (h);
    		fract = h - sextant;
    		vsf = v * sv * fract;
    		mid1 = m + vsf;
    		mid2 = v - vsf;
    		switch (sextant) 
    		{
    			case 0: *r = v; *g = mid1; *b = m; break;
    			case 1: *r = mid2; *g = v; *b = m; break;
    			case 2: *r = m; *g = v; *b = mid1; break;
    			case 3: *r = m; *g = mid2; *b = v; break;
    			case 4: *r = mid1; *g = m; *b = v; break;
    			case 5: *r = v; *g = m; *b = mid2; break;
    		}
        }
    }
    
    int main()
    {
    	double r,g,b,h,s,l;
    	r=145;
    	g=129;
    	b=81;
    	RGB_to_HSL(r,g,b,&h,&s,&l);
    	
    	cout<<h<<endl;
    	cout<<s<<endl;
    	cout<<l<<endl;
    	
    	HSL_to_RGB (h,s,l,&r,&g,&b);
    
    	cout<<r<<endl;
    	cout<<g<<endl;
    	cout<<b<<endl;
    
    
        return 0;
    }


    с++
    https://www.onlinegdb.com/
  • Допускается ли в коде смешивать парадигмы программирования?

    RabraBabr
    @RabraBabr
    artempawww, об чем вопрос? Когда пользоваться структурами а когда классами? Как выше писали как в команде принято так и делаете. Можно еще воспользоваться советом из CoreGuidelines
    https://isocpp.github.io/CppCoreGuidelines/CppCore...

    spoiler
    C.1: Organize related data into structures (structs or classes)
    Reason Ease of comprehension. If data is related (for fundamental reasons), that fact should be reflected in code.Example
    void draw(int x, int y, int x2, int y2); // BAD: unnecessary implicit relationships
    void draw(Point from, Point to); // better
    Note A simple class without virtual functions implies no space or time overhead.Note From a language perspective class and struct differ only in the default visibility of their members.Enforcement Probably impossible. Maybe a heuristic looking for data items used together is possible.


    и

    spoiler
    C.2: Use class if the class has an invariant; use struct if the data members can vary independently
    Reason Readability. Ease of comprehension. The use of class alerts the programmer to the need for an invariant. This is a useful convention.Note An invariant is a logical condition for the members of an object that a constructor must establish for the public member functions to assume. After the invariant is established (typically by a constructor) every member function can be called for the object. An invariant can be stated informally (e.g., in a comment) or more formally using Expects.
    If all data members can vary independently of each other, no invariant is possible.

    Example
    struct Pair { // the members can vary independently
    string name;
    int volume;
    };
    but:

    class Date {
    public:
    // validate that {yy, mm, dd} is a valid date and initialize
    Date(int yy, Month mm, char dd);
    // ...
    private:
    int y;
    Month m;
    char d; // day
    };
    Note If a class has any private data, a user cannot completely initialize an object without the use of a constructor. Hence, the class definer will provide a constructor and must specify its meaning. This effectively means the definer need to define an invariant.
    See also:

    define a class with private data as class
    Prefer to place the interface first in a class
    minimize exposure of members
    Avoid protected data
    Enforcement Look for structs with all data private and classes with public members.
  • Как записать массив пикселей в изображение?

    RabraBabr
    @RabraBabr
    Евгений Шатунов, четыре канала имеется в виду по 8 бит на RGB и альфа канал? Что за формат картинки? В зависимости от формата с альфой могут быть проблемы.
  • Что не так, в чем ошибка?

    RabraBabr
    @RabraBabr
    else if (i >= 1 || i <= 12)


    Вот это вот, что такое? И зачем оно вообще?
  • Как правильно передавать функцию в качестве параметра?

    RabraBabr
    @RabraBabr
    Matvey_Mt,

    Я правильно понял, что тут та же история что и с передачей массива в функцию


    А можно и так. Начиная с 20 стандарта для встроенных массивов возможен вариант с std::span (до этого из gsl)
    void foo(span<int> arr);
  • Какой open source проект написан на труъ Си++?

    RabraBabr
    @RabraBabr
    И теперь сверху жалуются, что мой код "слишком сишный", то есть написан на Си без плюсов, хоть я и использую классы. Проблема в том, что никто из коллег на работе не может нормально объяснить, как, собственно должен выглядеть "плюсовый" код.


    Давайте так. C и C++ два совершенно разных языка между которыми нету ничего общего. Ну кроме синтаксиса. C++ язык общего назначения является по сути наследником Simula 67 с синтаксисом C. Базовый синтаксис C с незначительными расширениями образует kernel language. Используя его совместно с механизмом классов вы получаете возможность программировать с использованием абстрактных типов данных. Очевидно "плюсовый" код должен выглядеть как код использующий АТД.

    Примеры.

    Типичный c стайл код:
    spoiler
    int j = 0;
        char s[] = "hello\n";
        char ch;
        
        while (s[j])
        {
            ch = s[j];
            putchar(toupper(ch));
            j++;
        }


    С++ код:
    spoiler
    std::string s("hello");
        std::transform(s.begin(), s.end(), s.begin(),
                       [](unsigned char c) -> unsigned char { return std::toupper(c); });
  • Какие разработчики работают с алгоритмами?

    RabraBabr
    @RabraBabr
    Wataru, Смотря на какую позицию собес. Если программист алгоритмист в библиотечный код. То вот это прям и есть суть его работы. Как собесить без алгоритмов я незнаю. Тут конечно давать задачки на время не надо. А лучше побеседовать по классическим алгоритмам (и структурам данных), что бы послушать ход размышлений человека. Оценить так сказать его логическое мышление. Ну а условным формошлепам в клиентский код да алгоритмы не нужны. Можно поговорить по душам.
  • Сработает ли деструктор, присвоив atomic?

    RabraBabr
    @RabraBabr
    Mercury13, У умершего может быть вообще, что угодно без каких либо гарантий. Там классическое UB. Имхо это вообще не валидная стратегия. К тому же и компилятор не даст ни каких гарантий по поводу value. В общем пример того как делать ненадо.
  • Пустой массив C++, как решить?

    RabraBabr
    @RabraBabr
    Объект передается по значению. Вы работаете с копией. Которая автоматически уничтожается при выходе из области видимости.

    З.Ы. Отучайтесь от дурного стиля именования переменных и функций.
  • Как написать explode() на c++?

    RabraBabr
    @RabraBabr
    O'k возьмем код попроще

    const Polygon operator+( const Polygon& lhs,const Polygon& rhs )
    {
        Polygon ret = lhs;
        const int last = rhs.GetNumPoints();
        for( int i = 0; i < last; ++i ) // Конкатенация
        {
            ret.AddPoint( rhs.GetPoint(i) );
            
        }
        return ret;
    }


    Этот код попадет в библиотечный. Потом мы не знаем сколько миллионов раз он будет вызываться в клиентском коде (GetNumPoints(); можно пихнуть в цикл).
  • Как написать explode() на c++?

    RabraBabr
    @RabraBabr
    Метод просто возвращает значение поля длины строки


    По значению? Каждый раз будет копирование?
  • Как написать explode() на c++?

    RabraBabr
    @RabraBabr
    Евгений Шатунов, То есть оно вызовется только один раз независимо от количества циклов?

    for(int i{0}; i < input.length(); ++i)

    сама input как я понимаю не меняется.
  • Как написать explode() на c++?

    RabraBabr
    @RabraBabr
    Безотносительно качества кода. У меня вопрос по поводу вызова .length(); внутри цикла. Насколько это хорошая идея с точки зрения производительности?
  • Как создать новый экземпляр класса переменной?

    RabraBabr
    @RabraBabr
    Я правильно понял или нет?
    spoiler
    /******************************************************************************
    
    Welcome to GDB Online.
    GDB online is an online compiler and debugger tool for C, C++, Python, PHP, Ruby, 
    C#, VB, Perl, Swift, Prolog, Javascript, Pascal, HTML, CSS, JS
    Code, Compile, Run and Debug online from anywhere in world.
    
    *******************************************************************************/
    #include <iostream>
    #include <memory>
    
    template<typename Derived>
    struct Clonable{
    public:
        virtual ~Clonable() = default;
        std::unique_ptr<Derived> clone(){ return std::unique_ptr<Derived>( vclone() ); }
    protected:
        virtual Derived* vclone() const = 0;
    };
    
    class MyClass : public Clonable<MyClass>{
    public:
        void print() const { std::cout << "I'm a MyClass!" << std::endl; }
        std::unique_ptr<MyClass> clone() { return std::unique_ptr<MyClass>{ vclone() }; }
    protected:
        virtual MyClass* vclone() const = 0;
    };
    
    class Implementation : public MyClass{
    public:
        virtual Implementation* vclone() const override
        {
            return new Implementation(*this);
        }
    };
    
    int main()
    {
        Implementation impl;
        
        MyClass* a = &impl;
        std::unique_ptr<MyClass> b = a->clone();
        a->print();
    
        return 0;
    }