LINUX.ORG.RU

Сообщения KennyMinigun

 

Нецензурная лексика?

Тут в Development была выкошена добрая часть обоснованной дискусии: Использование POD членов класса до их инициализации

Сообщение удалено leave по причине 5.1 Нецензурные выражения (0)

Поскольку причина удаления мне не понравилась, да и жалко сообщений, провел небольшие раскопки на тему. И, насколько, я вижу слово «педераст» не является нецензурным:

Максимальный негативный аттрибут характеризирующий слово — «вульгарный».

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

 ,

KennyMinigun
()

Использование POD членов класса до их инициализации

Привет ЛОР,

Подскажите, наличествует ли в приведенном коде UB? https://wandbox.org/permlink/6aWOyqM3lln2aJgT

class StringView {
public:
    StringView(const char *str, std::size_t size)
        : m_str(str),
          m_size(size)
    {}
    
    const char *data() const { return m_str; }
    std::size_t size() const { return m_size; }
    
private:
    const char * const m_str;
    const std::size_t m_size;
};

template <typename T>
class NumericStringView : public StringView {
public:
   NumericStringView(T value) 
       // вопрос с топика адресует строчку ниже
       : StringView(convertToBuffer(m_buffer, BUFFER_SIZE, value))
   {}
    
private:
    static StringView convertToBuffer(char *buffer, std::size_t size, T value) {
        auto str = std::to_string(value);
        if (str.size() >= size)
            throw std::runtime_error("value is too big");
        
        strcpy(buffer, str.c_str());
        return StringView(buffer, str.size());
    }
    
private:
    constexpr static std::size_t BUFFER_SIZE = 30;
    // указатель на данный POD-член передается в родительский конструктор
    char m_buffer[BUFFER_SIZE]; 
};

А именно интересует вызов конструктора базового класса с (неявной) передачей ему указателя на POD член дочернего класса (StringView(convertToBuffer(m_buffer, BUFFER_SIZE, value))).

P.S. да, я знаю про std::string_view и в оригинальном коде он и используется. В данном примере StringView использован для наглядности (см. по ссылке).

P.P.S. В оригинале в convertToBuffer используется sprintf и черная магия, потому попрошу не придираться к реализаии в примере.

 ,

KennyMinigun
()

Чем парсить целые числа?

Ситуация такова, что даже хваленый boost::lexical_cast может удивить: https://wandbox.org/permlink/PP0RTfmifVO816U0

std::cout << boost::lexical_cast<unsigned int>("-1"); // исключения не будет

Спойлер: http://www.boost.org/doc/libs/1_60_0/doc/html/boost_lexical_cast/frequently_a...

Скажите, есть ли вообще в природе средства для парсинга целых чисел (пускай даже ограниченные до radix=10) которые не удивляют?

Т.е. :

  • Не пропускают пробелов вначале строки
  • Интерпретируют всю строчку (а не до первого непонятного символа)
  • Нет автоматического определения radix (т.е. "012" будет 12 а не 10)
  • Могут интерпретировать подстроку (но польностью). Как boost::lexical_cast(str, len)
  • Трактуют 8-ми битные типы как числа (а не как символ/байт, ибо первый байт строки я и сам могу взять)
  • ... не имеют других подводных камней

 , ,

KennyMinigun
()

Самые раздражающие вещи при работе за компьютером

Сабж. Меня дико бесит залипание клавиш на клавиатуре, после того как разлил на нее чай/кофе/etc. Ведь как не чисти, все равно чтоб было как раньше — не добьешся

А что раздражает вас?

 ,

KennyMinigun
()

Scons проверить вывод clang

Вот и настал тот момент, когда мне надо ковырять билд-скрипты scons. Раньше использовал scons только как пользователь.

Помогите пожалуйста решить задачу: в ситуации когда clang используется как компилятор необходимо определить выбранную инсталляцию GCC (stdlib) и задефайнить ее версию как макро во время сборки.

Т.е. можно распарсить вывод:

$ clang++ -v
clang version 3.9.1-5ubuntu1 (tags/RELEASE_391/rc2)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
...
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0
...

Но я вот только не понимаю, как проверить какой используется компилятор и как получить путь к его бинарнику?

 , ,

KennyMinigun
()

Java скатилась?

Уже который раз при обновлении Java на оффтопике оно мне предлагает (RECOMMENDED!) поменять мой поисковик на Yahoo. Методы malware... чессслово. Если бы не корпоративный интранет сайт на Java, уже бы снес за такое.

>>> Читать еще

 , ,

KennyMinigun
()

Странное поведение kwin после установки virtualbox-guest-x11

Накатил я апдейт до Kubuntu Zesty/17.04 в VirtualBox (раньше было Yakkety/16.10. После того kwin перестал показывать окна: ни панелек плазмы ни обычных окошек не видно (однако процессы запущены и работают). Если сделать kwin --replace (т.е. перезапуск kwin с заменой) то окна появляются на несколько мгновений, затем снова исчезают.

Методом тыка опеределил, что после сноса virtualbox-guest-x11 все возвращается к норме (вот только двусторонний буффер обмена с хостом не работает, досадно). Во время установки пакета virtualbox-guest-x11 появляются такие сообщения:

update-alternatives: using /usr/lib/virtualbox/additions/00vboxvideo.conf to provide /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf (x86_64-linux-gnu_gl_conf) in auto mode
update-alternatives: using /usr/lib/virtualbox/additions/00vboxvideo.conf to provide /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf (x86_64-linux-gnu_egl_conf) in auto mode
Причем содержание файла довольно странное:
$ cat /usr/lib/virtualbox/additions/00vboxvideo.conf
/usr/lib/virtualbox/additions

Помимо, в системе еще установлен пакет virtualbox-guest-dkms.

Подскажите пожалуйста как поправить (хотя бы заставить двусторонний буфер обмена работать).

 , ,

KennyMinigun
()

Посоветуйте велокомпьютер

Вобщем присматриваю себе сабж по критериям (в порядке приоритета):

  1. Связь со смартфоном (bluetooth or whatever) / Strava
  2. Настраиваемость (чем больше опций, тем лучше)
  3. Поддержка (запоминание) 2-х (или больше) велосипедов
  4. Возможность «поиграться» с прошивкой (попрограммировать?)

Естественно, водонепроницаемость и быстрое крепление/отстегивание «is a must».

Набрёл в сети такой пафосный Wahoo Elemnt (и его «младшего брата» Wahoo Rflkt). В принципе нравится. Цена кусается, но не очень страшно.

Короче, посоветуйте, ато я себя чувствую как школьник уставившийся на светящуюся витрину.

 , , ,

KennyMinigun
()

Сигналы и передача по ссылке

Вопрос такой: есть ли гарантия, что если сигнал вызывается с ссылкой на обьект а слот тоже принимает ссылку, то сам обьект не будет копирован где-нибудь посередине?

Т.е. пример кода будет выглядеть так:

struct Foo { char data[500]; }

class Emitter : public QObject {
    Q_OBJECT
signals:
    void makeFoo() { 
        foo.emplace_back(); 
        emit fooCreated(foo.back());
    }

    void fooCreated(Foo &);
private:
   std::vector<Foo> foo;
};

class Receiver : public QObject {
    Q_OBJECT
public slots:
    void onFooCreated(const Foo &) {}
};

void run() {
    Emmiter e;
    Receiver r;
    QObject::connect(&e, &Emitter::fooCreated, 
                     &r, &Receiver::onFooCreated);

    e.makeFoo(); 
}

А вопрос для данног фрагмента кода: есть ли гарантии, что Foo не будет скопирован? (зависит ли копирование от типа соединения в QObject::connect)

 ,

KennyMinigun
()

float -> char[], размер буфера

Подскажите пожалуйста как просчитать размер буфера (N) в compile-time для конверсии float/double/long double -> char[N]. Примерный код для конверсии приведен ниже [1]

Сам буффер char[N] будет находится в POD структуре, т.е. его размер надо знать уже во время компиляции. Подскажите пожалуйста, как посчитать размер буфера в таких условиях? (есть ли смысл использовать numeric_limits10<T>::max_digits10 + X?)

[1] Конверсию планируется делать как-то так:

template <typename Decimal>
char* convertToBuffer(Decimal d, 
                      char *buf, 
                      std::size_t size,
                      std::size_t precision);

template <> 
char* convertToBuffer(float d, 
                      char *buf, 
                      std::size_t size,
                      std::size_t precision) 
{
    auto written = std::snprintf(buf, size, "%.*f", precision, d);
    if (written < 0)
        throw std::runtime_error("conversion went wrong");

    // %g не используется, ибо конверсия предпочтительно в виде %f
    if (written >= size) {
        written = std::snprintf(buf, size, "%e", d);
        if (written < 0)
            throw std::runtime_error("conversion went wrong");
    }

    return buf;
}

 ,

KennyMinigun
()

Система сборки для C/C++ c поддержкой VCS

В продолжение Чем собираете нативный код?

Возникла идея, что если бы система собрки могла анализировать данные, предоставленные системой контроля версий (кто сейчас ей не пользуется?). Это бы могло сократить время, требуемое на анализ файловой системы при сборке. Конечно, такое взаимодействие может наложить определённые ограничения (первой в голову приходит мысль о генерируемых файлах, которые игнорируются VCS).

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

 , , ,

KennyMinigun
()

Шаблоны, почему не работает?

Есть две (почти одинаковых) фунуции с шаблонным параметром:

#include <iostream>
#include <string>

template <typename String = std::string, typename Char = typename String::value_type>
void test1(const std::basic_string<Char>& s) {
  std::cout << "test1<Char> = " << s << std::endl;
}

template <typename String = std::string>
void test2(const std::basic_string<typename String::value_type>& s) {
  std::cout << "test2<typename String::value_type> = " << s << std::endl;
}

int main() {
    test1("test1");
    test2("test2");
}

Обьясните пожалуйста, почему test1 не компилируется (в то время как test2 проходит)?

P.S. g++ 6.2 говорит:

cbegin.cpp: In function ‘int main()’:
cbegin.cpp:85:18: error: no matching function for call to ‘test1(const char [6])’
     test1(«test1»);
                  ^
cbegin.cpp:73:6: note: candidate: template<class String, class Char> void test1(const std::__cxx11::basic_string<Char>&)
 void test1(const std::basic_string<Char>& s) {
      ^~~~~
cbegin.cpp:73:6: note:   template argument deduction/substitution failed:
cbegin.cpp:85:18: note:   mismatched types ‘const std::__cxx11::basic_string<Char>’ and ‘const char [6]’

 , ,

KennyMinigun
()

GCC fallthrough в switch

Недавно задался целью найти способ заставить GCC генерировать предупреждение о fallthrough в switch. Целевая версия GCC =5.2 -std=c++14.

Судя по всему, аттрибут [[fallthrough]] войдет в C++17. Однако нашлась страничка о неком __attribute__((fallthrough)): https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html с упоминанием флага -Wimplicit-fallthrough.

После беглой проверки на melpon.org/wandbox на разных версиях GCC оказалось, что флаг поддерживается только в GCC 7 (который еще не вышел). Ну и стало ясно, что для GCC 5.2 такого ворнинга нет.

Далее я накопал еще обсуждение #7652 на багзилле о, собственно, имплеиентации -Wimplicit-fallthrough. Но пока читал коментарии «пальцем в небо» попробовал вот такой код:

    int a;
    switch (2) {
        case 2:
            a = 2;
            [[gcc::fallthrough]]
        default:
            a = 1;
    }
http://melpon.org/wandbox/permlink/PSr9Mh7TERKl1I6w

Так вот, вопрос: почему оно компилируется? Не баг ли?

 ,

KennyMinigun
()

Интроспекция с boost

Нашел кусочек буста, который должен делать то, что мне надо: проверять имеет ли шиблонный тип метод с заданным именем и сигнатурой.

Так вот, собственно «документация»: http://www.boost.org/doc/libs/1_59_0/libs/tti/doc/html/the_type_traits_intros...

И есть такой код, который не компилируется: http://melpon.org/wandbox/permlink/Khvu0EIUAurzngdR

Вкратце:

#include <type_traits>
#include <string>
#include <boost/tti/has_member_function.hpp>

namespace detail 
{
BOOST_TTI_HAS_MEMBER_FUNCTION(resize);

template <typename ... Args>
constexpr bool has_member_function_resize_v = has_member_function_resize<Args...>::value;
}

template <typename Container>
constexpr bool has_resize_v = detail::has_member_function_resize_v<void (Container::*)(typename Container::size_type)>;

template <typename Container>
std::enable_if<has_resize_v<Container>>
f1(const Container&) { std::cout << "has resize" << std::endl; }

template <typename Container>
std::enable_if<!has_resize_v<Container>>
f1(const Container&) { std::cout << "no resize" << std::endl; }

int main() {
   f1(std::string());
}

prog.cc: In function 'int main()':
prog.cc:46:14: error: call of overloaded 'f1<S>(S)' is ambiguous
     f1<S>(S());
              ^
prog.cc:28:1: note: candidate: std::enable_if<has_resize_v<Container> > f1(const Container&) [with Container = std::__cxx11::basic_string<char>]
 f1(const Container&) {
 ^~
prog.cc:34:1: note: candidate: std::enable_if<(! has_resize_v<Container>)> f1(const Container&) [with Container = std::__cxx11::basic_string<char>]
 f1(const Container&) {
 ^~

Помогите пожалуйста понять, что ему не нравится

 ,

KennyMinigun
()

Move конструктор для POD (структур на стеке)

Допустим стуктуру данных

template <size_t n>
struct Foo {
    char buffer[n];
};

Вопрос такой: имеет ли смысл писать move конструктор для такого типа данных? Если да, то как он будет выглядеть? И принесет ли он (конструктор) какой-либо профит?

 

KennyMinigun
()

Уведомления отмечаются прочитанными на еще не просмотренных страницах

Суть такова, что если непрочитанных уведомлений накопилось достаточно много (что они не вмещаются все на одной странице), то по переходу по ссылке Уведомления «прочитанными» отмечаются все новые уведомления, даже те, которые находятся на еще не открытых страницах (2-ой и далее).

 , ,

KennyMinigun
()

Фото пропали с телефона / gdrive

Сделал недавно фото телефоном, но через несколько минут проверив «Галерею» не обнаружил фотографии. Открыв «Камеру» в маленькой превьюшке увидел фотографию но после попытки открыть миниатюру телефон на пол-секунды завис с серым прямоугольником вместо фото и затем показал мнепредыдущее фото.

Интересно то, что я сделал два почти одинаковыхфото с разницей в ~2 секунды. На фото было предостережение, что Galaxy Note запрещены на борту Swiss. Фото было сделано в аэропорту.

Даже во время напиасания этого поста Chrome крешнулся.

 , , ,

KennyMinigun
()

std::enable_if для std::is_integral исключая bool

Глупый вопрос: есть ли какой-нибудь предикат из std:: чтоб проверить что шаблонный тип есть численным, но не bool?

Пример:

template <typename Numeric>
std::enable_if_t<(std::is_integral<T>::value && \
                  !std::is_same<T, bool>::value) ||
                 std::is_floating_point<T>::value,
                 Numeric>
processValue(const std::string &value) {
    return boost::lexical_cast<T>(value);
}

Или надо написать свой супер-пyпер предикат?

P.S. Стандарт C++14

 ,

KennyMinigun
()

Откинуть unstaged, сохранить staged изменения в одном файле

Гипотетическая ситуация: мастерю я красивый комит из набора изменненных unstaged файлов с помощью add -i. В файле foo.txt я заметил, что часть изменений не нужна. Естественно, я добавил нужные изменения в stage с помощью add -i. Теперь хочу «стереть» ненужные изменения.

Вот маленькая иллюстрация ситуации:

$ cat > foo.txt <<END
1. wanted
2. unwanted
END

$ git add -i foo.txt

git diff --staged foo.txt
diff --git a/foo.txt b/foo.txt
index e69de29..6a5ed99 100644
--- a/foo.txt
+++ b/foo.txt
@@ -0,0 +1 @@
+1. wanted

$ git diff foo.txt
diff --git a/foo.txt b/foo.txt
index 6a5ed99..9e6d867 100644
--- a/foo.txt
+++ b/foo.txt
@@ -1 +1,2 @@
 1. wanted
+2. unwanted

А вопрос такой: как мне стереть unstaged изменения в foo.txt, чтобы:

  1. не трогать других измененных unstaged файлов
  2. сохранить staged изменения в foo.txt (и вообще весь stage)

?

 ,

KennyMinigun
()

Kubuntu и Mint обьединили силы и (наконец) опакетили Plasma 5.8

Сабж. В kubuntu-backports-landing PPA (что это еще за зверь?) доступна Plasma 5.8, Applications 16.04.3 и Frameworks 5.28. Официальный предлог — тестирование.

Новость тут: http://kubuntu.org/news/kubuntu-and-linux-mint-doing-plasma-5-8-testing/

P.S. Теперь хоть слазь с KDE Neon обратно на yakkety.

 , , ,

KennyMinigun
()

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