• Можно ли инициализировать статический массив алгоритмом?

    В C++14 для этого есть constexpr-функции:

    #include <iostream>
    #include <array>
    
    template<typename T, size_t n>
    constexpr T& at(std::array<T, n>& a, size_t i) {
        return const_cast<T&>(static_cast<const std::array<T, n>&>(a)[i]);
    }
    
    template<typename T, size_t n>
    constexpr const T& at(const std::array<T, n>& a, size_t i) {
        return a[i];
    }
    
    constexpr std::array<int, 20> generate_fib() {
        auto result = std::array<int, 20>{};
        for (size_t i = 0; i < 20; ++i) {
            if (i < 2) {
                at(result, i) = 1;
            } else {
                at(result, i) = at(result, i-1) + at(result, i-2);
            }
        }
        return result;
    }
    
    constexpr static const auto fib = generate_fib();
    
    int main()
    {
        for (auto elem : fib) {
            std::cout << elem << ' ';
        }
        return 0;
    }

    Скомпилировать онлайн на GCC6.

    Ограничения:
    1. В C++14 не предусмотрели constexpr для std::array::operator[]. Обещают исправить в C++17, а пока имеем костыль в виде функции at.
    2. Ни одна из текущих версий Visual Studio не способна скомпилировать данный код. M$ не дружит с constexpr.
    Ответ написан
  • Как передать в функцию указатель на массив?

    В С нельзя передавать массив по значению.
    void uart_packet_damp(uint8_t uart_command_buf[])
    Здесь передача по указателю происходит.
    Ответ написан
    Комментировать
  • Как определить, содержит ли закрытая программа свободный код?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Просто для справки и осмысления (взято из wiki):
    Защита авторских прав
    Фонд владеет авторскими правами на бо́льшую часть программного обеспечения GNU, а также на некоторые не-GNU программы. От любого человека, делающего вклад в пакеты GNU, Фонд требует письменное заявление о передаче авторских прав, чтобы иметь возможность защищать программы в суде в случае возникновения спора. Кроме того, это позволяет при необходимости менять лицензию на ту или иную работу, не связываясь с каждым из разработчиков, когда-либо сделавших вклад в программу.
    Ответ написан
    1 комментарий
  • Как определить, содержит ли закрытая программа свободный код?

    @Z-r
    > Как определить, содержит ли закрытая программа свободный код?

    Я не знаю, что вы имеете в виду под «закрытой программой» (прекратившую свое существование?), но какая разница, что́ плагиатили — свободную программу или несвободную? Методы судебной экспертизы от этого не поменяются.

    Если вы надеетесь, что здесь кто-нибудь вам о них расскажет длиннее, чем в двух словах (как это сделал т. Rou1997:), то боюсь, зря надеетесь. Это целое направление в криминалистике, по которому даже тематические журналы выходят. Я в нем совершенно не специалист, но ряд товарищей рекомендует для первоначального ознакомления книгу:

    Zeidman, Bob. The Software IP Detective’s Handbook: Measurement, Comparison, and Infringement Detection — Prentice Hall, 2011

    Да, обязан предупредить, что говоря о свободных лицензиях автор допускает пару весьма грубых ошибок. А также имеет выраженное предубеждение против свободных программ, в чем не стесняется признаваться. И, разумеется, не чурается использовать пропагандистскую терминологию. И вообще не прочь порассуждать на темы, не имеющие отношения собственно к криминалистической экспертизе (вы там даже про «ЮКОС» и Ходорковского пассаж найдете :-). Но, я полагаю, у вас достаточно критического восприятия, чтоб все это не мешало извлечь из книги рациональное зерно.
    Ответ написан
    1 комментарий
  • Как определить, содержит ли закрытая программа свободный код?

    Rou1997
    @Rou1997
    Но что если в код несвободной программы копировать только ряд функций?

    Определят по тем, которые скопируете: дизассемблер => хеш тела функции => сравнение.
    Но это смотря что вы скопируете, сколько и насколько важно в вашей программе, да и ваша программа насколько важна.
    Пока все эти показатели у вас "по нулям", беспокоиться абсолютно никакого смысла нет.
    Обфусцировать код не проблема, вон никто не может разобрать JVM и доказать "ткнув носом" в листинг ее кода, является ли она просто интерпретатором байт-кода или действительно компилирует что-то в машинный код, никому это не нужно.
    Ответ написан
    6 комментариев
  • Допустимо ли проприетарному приложению запускать бинарник под GPL?

    @Z-r
    > имеет ли проприетарная программа право

    Программа прав не имеет. Права имеет человек. :-)

    > Допустимо ли проприетарному приложению запускать бинарник под GPL?

    Интересно, как вы видите мир, в котором на этот вопрос правильный ответ отрицателен? Так, что из-под Винды нельзя запустить ГНУ Емакс или GoldenDict?

    > Вообще, допустимо ли в рамках одного продукта GPL ПО и проприетарное?

    Тоже удивительный вопрос. Макось, Андроид или Убунта — это на ваш взгляд не «один продукт»?

    Если же у вас есть какой-то конкретный вопрос по конкретной ситуации, то, наверное, его и стоит задать. :-)

    P. S.

    [из комментариев]> Конкретный вопрос: если я соберу ffmpeg с поддержкой x264 (что сделает лицензию ffmpeg GPL), и не залинкую на ффмпежные библиотеки "свою" программу, а буду запускать исполняемый файл ffmpeg вызовом exec, или start, а потом читать его вывод через stdout, могут ли меня обязать открыть исходный код "своей" программы?

    Едва ли. Мне неизвестны такие прецеденты.

    > Другой вопрос: если есть программный продукт, который является распределённой системой, т.е. у него скажем 10 исполняемых файлов, которые сообщаются между собой, скажем, через сокеты, и один из этих 10 исполняемых файлов содержит код под GPL, то нужно открыть этот 1 или все 10?

    Позволю себе процитировать ЧаВо по GNU GPL:

    Какова разница между «сборником» и другими видами «измененных версий»?

    «Сборник» состоит из некоторого числа отдельных программ, распространяемых вместе на одном компакт-диске или другом носителе. GPL разрешает вам создавать и распространять сборник, даже если лицензии других программ несвободны и несовместимы с GPL. Единственное условие — что вам нельзя выпускать сборник на условиях, которые запрещают пользователям осуществлять права, которые предоставили бы им отдельные лицензии каждой из программ.

    Где проходит граница между двумя отдельными программами и одной программой из двух частей? Это юридический вопрос, который в конечном счете решают судьи. Мы убеждены, что правильный критерий принимает в расчет как механизм взаимодействия (запуск процессов, каналы обмена данными, удаленные вызовы процедур, вызовы функций в общем адресном пространстве и т. д.), так и содержание взаимодействия (обмен какого рода информацией происходит).

    Если модули включаются в один и тот же исполняемый файл, они определенно комбинируются в одной программе. Если модули составлены, чтобы работать, связываясь в общем адресном пространстве, это почти наверное означает, что они комбинируются в одну программу.

    Напротив, каналы обмена данными, *сокеты* и аргументы командной строки — механизмы взаимодействия, обычно используемые между двумя отдельными программами. Так что когда они применяются для взаимодействия, модули обычно являются отдельными программами. Но если содержание взаимодействия достаточно глубоко, если происходит обмен сложными внутренними структурами данных, это тоже может быть основанием для того, чтобы считать две части составляющими одной более крупной программы.

    https://www.gnu.org/licenses/gpl-faq.ru.html#MereA... (выделение мое)

    От себя добавлю что:

    — Прецеденты, когда кого-либо заставили освободить программу, поскольку она была спроектирована для сообщения через сокеты с программой под авторским левом, мне по-прежнему неизвестны.

    — А в целом ваше желание любыми способами об’ехать авторское право на кривой козе, чтоб дать своим пользователям как можно *меньше* свободы, ничего, кроме отвращения, не вызывает.
    Ответ написан
    4 комментария