LINUX.ORG.RU

Сообщения MOPKOBKA

 

Как создать массив в С++

Форум — Development

Нужно создать массив с элементами у которых разный размер. Размер массива, элементов, и их порядок известен в compile-time. В коде могу представить так:

template<int N = 5>
struct A {
  std::array<int, N> = {
    // Вот эти значения должны как то создаваться автоматически
    // 1...N, N = 5
    std::array<int, 1>,
    std::array<int, 2>,
    std::array<int, 3>,
    std::array<int, 4>,
    std::array<int, 5>, 
  };
};


template<int N = 3>
struct B {
  std::array<int, N> = {
    // Вот эти значения должны как то создаваться автоматически
    std::array<int, 1>,
    std::array<int, 2>,
    std::array<int, 3>,
  };
};

Есть что то готовое, что можно использовать, и работающее в компилтайме?

-----------------------------------------------------

Первое решение:

#include <type_traits>
#include <iostream>
#include <tuple>
#include <array>

template <typename... Ts>
class tuple_array_t : public std::tuple<Ts...> {
public:
    using std::tuple<Ts...>::tuple;

    template <size_t N>
    constexpr auto&& operator[](std::integral_constant<size_t, N>) {
        return std::get<N>(*this);
    }

    [[nodiscard]] constexpr auto size() const {
        return std::integral_constant<std::size_t, std::tuple_size_v<decltype(static_cast<std::tuple<Ts...>>(*this))>>();
    }
};

template <std::size_t From, std::size_t To, class F>
constexpr void constexpr_for_range(F&& f) {
    if constexpr (From < To) {
        f(std::integral_constant<size_t, From>());
        constexpr_for_range<(std::size_t)From + 1, (std::size_t)To>(f);
    }
}

template<typename T, size_t N, typename... Ts>
constexpr auto linear_tuple_array() {
    if constexpr (N > 1) {
        return linear_tuple_array<T, N - 1, Ts..., std::array<T, N>>();
    } else {
        return tuple_array_t<Ts..., std::array<T, N>>();
    }
}

constexpr auto generate_super_array() {
    auto linear_array = linear_tuple_array<float, 10>();
    auto linear_array_size = linear_array.size();
    constexpr_for_range<0, linear_array.size()>([&] (auto i) {
        constexpr auto n = linear_array_size - i;
        constexpr_for_range<0, n>([&] (auto j) {
            linear_array[i][j] = i * 1000 + j;
        });
    });
    return linear_array;
}

int main() {
    auto array = generate_super_array();

    auto x = std::integral_constant<std::size_t, 5>();
    auto y = std::integral_constant<std::size_t, 3>();
    
    // #output: 5003
    std::cout << array[x][y] << std::endl;
}

------------------------------------------------
Второе решение

#include <cstddef>
#include <type_traits>
#include <iostream>

template <typename T, size_t N>
class ctmat;

template <typename T>
class ctmat<T, 1>
{
public:
    template <size_t i, size_t j>
    typename std::enable_if<i == 0 && j == 0, T>::type& get() { return m_v[0]; }
    template <size_t i, size_t j>
    typename std::enable_if<i == 0 && j == 0, T>::type const& get() const { return m_v[0]; }
    template <typename U>
    friend std::ostream& operator<<(std::ostream& out, const ctmat<U, 1>& m);
private:
    T m_v[1];
};

template <typename T, size_t N>
class ctmat: public ctmat<T, N-1>
{
public:
    typedef ctmat<T, N-1> base_type;
    using base_type::get;
    template <size_t i, size_t j>
    typename std::enable_if<i == N-1 && j < N, T>::type& get() { return m_v[j]; }
    template <size_t i, size_t j>
    typename std::enable_if<i == N-1 && j < N, T>::type const& get() const { return m_v[j]; }
    base_type& base() { return static_cast<base_type>(*this); }
    base_type const& base() const { return static_cast<const base_type&>(*this); }
    template <typename U, size_t M>
    friend std::ostream& operator<<(std::ostream& out, const ctmat<U, M>& m);
private:
    T m_v[N];
};

template <typename T>
std::ostream& operator<<(std::ostream& out, const ctmat<T,1>& m)
{
    out << m.m_v[0] << std::endl;
    return out;
}

template <typename T, size_t N>
std::ostream& operator<<(std::ostream& out, const ctmat<T, N>& m)
{
    out << m.base();
    for (size_t j = 0; j != N; ++j)
        out << m.m_v[j] << ' ';
    out << std::endl;
    return out;
}

int main()
{
    ctmat<int, 1> m1;
    static_assert(sizeof(m1) == sizeof(int), "Unexpected size");
    m1.get<0,0>() = 1;
    //m1.get<1,0>() = 2;
    //m1.get<0,1>() = 3;
    std::cout << m1;
    ctmat<int, 2> m2;
    static_assert(sizeof(m2) == 3*sizeof(int), "Unexpected size");
    m2.get<0,0>() = 4;
    //m2.get<0,1>() = 5;
    m2.get<1,0>() = 6;
    m2.get<1,1>() = 7;
    std::cout << m2;
    return 0;
}

 

MOPKOBKA
()

Wine сбивает значки на рабочем столе при изменении видео-режима

Форум — Desktop

Можно ли как то заставить его не менять видео-режим, а просто создавать full-screen окно и самому растягивать изображение? Эмуляция рабочего стола создает рамку, немного не то.

 

MOPKOBKA
()

Почему когда пишут скрипты на Bash не используют фреймворки?

Форум — Talks

Очевидно что они ускоряют написание скриптов, упрощают, и помогают избегать ошибок. Как пример возьмем: https://github.com/niieani/bash-oo-framework

Почему же люди продолжают непрофессионально подходить к этому делу, и пишут чуть ли не в sh-стиле? Такое ощущение что они не сталкивались с реальным миром.

А еще труднее понять почему при написании скриптов не используют нормальную IDE с отладчиком?! Не знают? Не могут научиться?

Да, конечно Bash уже устарел, но это не повод погружаться в 60-е если нужно его использовать.

 ,

MOPKOBKA
()

О печальном состоянии веб-программирования

Форум — Talks

Столкнулся с проектом Vue+Symfony+GitLab. Я не понимаю кому выгодны эти запутанные инструменты, веб-фреймворки, это безумное усложнение? Но больше всего не понимаю, как это можно любить.

Критикуешь - предлагай альтернативу. И так, все предыдущие 3 года я просто мог работать, если не попадался такой вот мусор! Я подключал удаленную FTP папку в Windows 10, и редактировал файлы через notepad.exe, с тех пор как он научился в кодировки я даже не использовал Notepad++. Если сайт посещаемый, и не нужно было экспериментировать над пользователями, я делал из page.php копию page2.php и редактировал код там. Frontend? Есть JQuery и куча плагинов, скачиваешь min файл и копируешь себе в папку, вот и вся сборка.

Теперь же перейдем к моему текущему проекту. Vue, эта штука просто отбирает контроль за происходящим, как на этом сделать что то нормальное я не представляю, не удивительно что современные веб-приложения еле работают, а в IE или PaleMoon не запускаются вообще. Ну ладно, там и проект не сложный, с ограничениями я воевал всего лишь неделю... Но эти бесконечные сборки, я не против сборки, но оно же компилируется медленнее плюсов, зачем же так издеваться?! Такое и даром не нужно!

Symfony, ну явно для любителей Java штука, программирование на текстовых конфигах присутствует. А вот какой смысл делать yml/json/xml когда есть config.php? Это же скриптовый язык, зачем так извращаться?! В остальном это просто ад, даже описывать не буду, для простейших действий требуется 100500 часов, и классы, классы, классы. И шаблоны, как будто бы PHP плохой шаблонизатор. Видимо реально это делалось для Java, а потом конвертором перегнали в PHP.

GitLab, Git - отличные замедлители разработки, как и системы сборки фронтенда, я кажется близко к разгадке, программисты на скриптовых языках завидовали плюсовикам, у них проект пока скомпилируется, можно 20 чашек кофе выпить, вот и продвинули это. Git - ну просто каргокульт, пришлось однако ставить это жирное нечто на десятку, отъело пол гига!!! GitLab - поприкольнее, поинтереснее, просто так коммитить нельзя, ветка ограниченна, нужно обязательно попросить разрешение управлящего, это же так круто! Если вы не доверяете мне, зачем просить что то делать? Потом еще начинается «а разбейте на коммиты, слишком много изменений»...

А вам это нравится, почему? Вы задумываетесь над тем что вы делаете? И как это делаете?

 , ,

MOPKOBKA
()

Поставил docker через snap

Форум — Talks

Ну а че, Canonical рекомендуют и сами пакет сделали.

Поднимаю проект, а volumes-таргеты в контейнере пустые, в чем же дело? В Docker? Разбирался, разбирался.

Оказывается Docker из snap вместо того что мы моунтить мои папки, создавал папки вида ~/???????/???????/%srcdir%, где знаки вопроса действительно ими были, потому что папки на русском (~/Проекты/Проект/), видимо snap разрабатывает Eddy_Em.

Захожу внутрь этих папок - пустые. Вот они и пробрасывались в контейнер.

 ,

MOPKOBKA
()

SDL2 переезжает на GitHub

Форум — Talks

https://discourse.libsdl.org/t/sdl-moving-to-github/28700/5

Одна из причин, по которой мы раньше не рассматривали переход на GitHub, заключается в том, что у этого проекта была политика владения всей своей инфраструктурой. Этот проект пережил кончину Локи, он пережил деволюцию, захваченную самозванцем, он пережил ненадежные серверы Dreamhost. Несколько лет назад у нас этого всего было достаточно, и мы переместили все в Digital Ocean, потому что это просто размещенный в одном месте Linux-сервер; мы поддерживаем все службы, и ничего не извлекается из-под нас ... в худшем случае мы просто переместим нашу ночную резервную копию на новый хост и обновим DNS, а не будем просто облажаться, когда поставщики откажутся от услуг или сломают что-то и просто обычно не не отвечаю на телефонные звонки.

Компромисс за эту свободу, конечно же, заключается в том, что все глючит и ломается, и ни у кого нет времени, чтобы исправить это. Bugzilla на самом деле не сильно отличается от того, что было двадцать лет назад (и, как мы обнаружили, разработчики Bugzilla не удосужились обновлять свой код, когда новые выпуски MySQL сломали его, а я разработчик игр и не хочу исправить код Perl, созданный два десятилетия назад, чтобы трекер ошибок заработал после обновления Ubuntu, бла-бла-бла).

Это не только Bugzilla. Это вики, списки рассылки, маленький причудливый веб-интерфейс Mercurial. Маленькая вещь с открытым исходным кодом, на которую мы полагаемся, но над которой никто не работает, и, вероятно, в ней есть дыры в безопасности. Все это дрянно и вызывает трения разработчиков. Это вызывает это у Сэма и меня, а мы старые ковбои командной строки Unix, поэтому для тех, кто ожидает, что компьютеры будут относиться к ним так же, как компьютеры в 2021 году - с гладкими пользовательскими интерфейсами и без cronjobs, которые иногда терпят неудачу, пока Райан не начнет перезапускать службу по ssh - это становилось несостоятельным.

Поэтому, переместив его на GitHub, мы обнаружили, что многие вещи стали лучше, потому что над этим каждый день работает большой оплачиваемый штат инженеров. И я вырос в период расцвета Фонда свободного программного обеспечения, поэтому я знаю, что это ловушка, но я устал, и у меня нет сил, чтобы быть администратором сервера для чего-то, что скреплено скотчем и молитвами, когда я я действительно должен писать код OpenGL.

Итак, мы переходим на серверы, которые мы не контролируем, что действительно заставляет меня нервничать, но аргумент такой: Microsoft владеет GitHub, и маловероятно, что Microsoft в ближайшее время обанкротится. Если Microsoft отключит GitHub, проблемы возникнут не только с SDL, но и со всей экосистемой с открытым исходным кодом , поэтому заинтересованные стороны будут быстро двигаться, чтобы помочь вам перейти в другое место… верно?

 , ,

MOPKOBKA
()

Виртуальная флешка (в /dev)

Форум — General

Есть файл сделанный с помощью dd, нужно сделать девайс (/dev/xxx) детектящийся как флешка с внутренностями этого файла.

Именно так, а не просто примонтировать внутренности.

 ,

MOPKOBKA
()

Почему у printf такие странные спецификаторы?

Форум — Development

Ведь логично было бы сделать %i=integer, %f=float, %d=double. Расскажите историю.

 ,

MOPKOBKA
()

Вышел Xfce 4.16

Новости — Open Source
Группа Open Source

После года и 4 месяцев разработки был выпущен Xfce 4.16.

( читать дальше... )

>>> Подробности

 ,

MOPKOBKA
()

RSS подписка на новые темы