LINUX.ORG.RU

Сообщения KennyMinigun

 

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

Форум — Development

Подскажите пожалуйста как просчитать размер буфера (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

Форум — Development

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

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

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

 , , ,

KennyMinigun
()

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

Голосования — Голосования

Вопрос про систему сборки. Какими из перечисленных Вы предпочитаете пользоваться / используете в «продакшене»?

  1. GNU Make 494 (51%)

    ********************************************************************************************************************************************************************************************************************************************************************************************************************************

  2. CMake 444 (46%)

    ***********************************************************************************************************************************************************************************************************************************************************************************************

  3. Qmake 162 (17%)

    ********************************************************************************************************

  4. Autotools 138 (14%)

    *****************************************************************************************

  5. Простой (свой) скрипт сборки (bash, batch, ...) 114 (12%)

    *************************************************************************

  6. Другой вариант (в комментариях) 79 (8%)

    ***************************************************

  7. Maven 63 (6%)

    ****************************************

  8. Ninja 53 (5%)

    **********************************

  9. nmake (Visual Studio) 46 (5%)

    *****************************

  10. Gradle 43 (4%)

    ***************************

  11. BSD Make 37 (4%)

    ***********************

  12. QBS 21 (2%)

    *************

  13. Своя системя сборки (аля flower в Opera) 18 (2%)

    ***********

  14. Scons 17 (2%)

    ***********

  15. Premake 4 (0%)

    **

  16. Tup 2 (0%)

    *

Всего голосов: 1735, всего проголосовавших: 971

 , , ,

KennyMinigun
()

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

Форум — Development

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

#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

Форум — Development

Недавно задался целью найти способ заставить 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

Форум — Development

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

Так вот, собственно «документация»: 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 (структур на стеке)

Форум — Development

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

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

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

 

KennyMinigun
()

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

Форум — Linux-org-ru

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

 , ,

KennyMinigun
()

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

Форум — Talks

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

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

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

 , , ,

KennyMinigun
()

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

Форум — Development

Глупый вопрос: есть ли какой-нибудь предикат из 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 изменения в одном файле

Форум — Development

Гипотетическая ситуация: мастерю я красивый комит из набора изменненных 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

Форум — Talks

Сабж. В 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
()

Ubuntu Cleaner

Форум — Talks

Как говорится «Ubuntu — не линукс». Вот собственно накостылизировали для нее Cleaner: https://github.com/gerardpuig/ubuntu-cleaner

И, соответственно, PPA:

sudo add-apt-repository ppa:gerardpuig/ppa
sudo apt-get update && sudo apt-get install ubuntu-cleaner

Ислочник: http://www.omgubuntu.co.uk/2016/12/free-space-ubuntu-cleaner-janitor-app

 , ,

KennyMinigun
()

Кнопочки на Android 7.1

Форум — Mobile

Прилетело обновление системы на Nexus. И они поменяли расположение кнопочек в горизонтальном положении: теперь они всегда снизу (около порта зарядки), а не справа, как раньше. Напрягает то, что порядок кнопок тоже меняется в зависимости от ориентации экрана: при наклоне налево кнопка «назад» вверху, а при наклоне направо — внизу.

Иллюстрации:

Оно как-нибудь настраивается?

 , ,

KennyMinigun
()

GDB Python, проинспектировать std::vector

Форум — Development

Привет,

Я снова с GDB. Теперь пытаюсь написать GDB command корорая мне напечатает вектор как нужно. Но почему-то не могу из gdb.Value (std::vector<Foo>) добраться ни до размера вектора ни до его данных.

Т.е. есть приблизительно такой код:

struct Foo { 
    int a; 
    explicit Foo(in a) : a(a) {}
};

int main() {
    std::vector<Foo*> v = { new Foo(1), new Foo(2), new Foo(3) };
    return 0;
}

Сейчас я печатаю вектор в такой способ:

def FooVect (gdb.Command):
  def __init__(self):
    super(FooVect, self).__init__('foovect', gdb.COMMAND_OBSCURE, gdb.COMPLETE_SYMBOL)

  def invoke(self, arg, from_tty):
    size = gdb.parse_and_eval('({0}).size()'.format(arg))
    for i in range(0, size):
      print '[{0}] {1}'.format(i, gdb.parse_and_eval('({0})[{1}].a'.format(i, arg)))

Потом в gdb:

(gdb) foovect v
[0] 1
[1] 2
[2] 3

Однако parse_and_eval довольно медленный и когда количество итемов растет, приходится долго ждать. Насколько я понимаю parse_and_eval «вытягивает» целый символ с вместе потрохами. Т.е. можно было бы обойтись одним вызовом parse_and_eval.

Но если код invoke (например) сделать таким:

  v = gdb.parse_and_eval(arg)
  print v[0]

То ничего не получается:

Traceback (most recent call last):
  File "<string>", line 2, in <module>
gdb.error: Cannot subscript requested type.
Error while executing Python code.

Более того: в через v вообще не видно как достаться до данных вектора:

(gdb) python
>v = gdb.parse_and_eval('v')
>print dir(v)
>end
['__abs__', '__add__', '__and__', '__call__', '__class__', '__delattr__', '__delitem__', '__div__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__int__', '__invert__', '__le__', '__len__', '__long__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__nonzero__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rxor__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'address', 'cast', 'const_value', 'dereference', 'dynamic_cast', 'dynamic_type', 'fetch_lazy', 'is_lazy', 'is_optimized_out', 'lazy_string', 'reference_value', 'referenced_value', 'reinterpret_cast', 'string', 'type']

Есть идеи? Может системные pretty-printers для std::vector мешают?

(gdb) python
>v = gdb.parse_and_eval('combinedPUPaths')
>print v
>end
std::vector of length 3, capacity 4 = {
  0x7f3edd4d66f0,
  0x7f3edd4d6710,
  0x7f3edd4d6720
}

P.S.

$ cat ~/.gdbinit
set print array on
set print pretty on
set print object on
set print static-members off

 , ,

KennyMinigun
()

GDB напечатать вектор обьектов (только некоторые поля)

Форум — Development

Допустим есть что-то такое в коде:

struct Foo {
   int a;
   std::string b;
};

std::vector<Foo*> foos;

Я хочу в gdb напечатать все обьекты из вектора, но только поле «b». Пытаюсь сделать через GDB Command:

(gdb) define pfoo
  set $v = $arg0
  set $i = 0
  while ($i < $v.size())
    print $v[$i]->b;  
  end
end

(gdb) pfoo foos 
Однако получаю ошибку:

Attempt to take address of value not located in memory.

Или еще проще:

(gdb) set $v = foos
# работает
(gdb) print $v
# не работает
(gdb) print $v.size()
Attempt to take address of value not located in memory.

Помогите пожалуйста сделать задуманное.

 , ,

KennyMinigun
()

Майкрософтовский Linux — FS metadata fail

Форум — Talks

Суть такова: не можно создавать/редактировать «линуксовые» файлы (те, что под %localappdata%\lxss) программами windows, так как это чревато порчей метаданных, и как следствие недоступностью файлов из Linux.

Для !Ъ: https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-f...

 , ,

KennyMinigun
()

Зачем писать statement в последней пустой секции switch?

Форум — Development

Итак, есть какой-то такой говнокод:

enum Whatever { ONE = 1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT };

void foo(Whatever v) {
    switch (v) {
    case ONE:
    case TWO:
    case SIX:
        std::cout << v << std::endl;
    case THREE: // fallthrough
    default:
       break; // без хотябы ";" не компилируется: 
              // error: expected primary-expression before '}' token
    }
}

Вопрос: как ничего не делать и жить счастливо зачем в конце обязателен какой-нибудь statement? Почему что мешает сделать как в случае fallthrough?

 , ,

KennyMinigun
()

Уже два процента

Форум — Talks

Последние три месяца подряд рыночная доля десктопного Линукса держится чуть выше двух процентов (по данным аналитической компании New Market Share).

Конечно же статистика — одна из форм лжи и статистика Wikimedia по прежнему показывает привычные 1.2%. Но в любом случае, наблюдается тенденция по увеличению (а не уменьшению) доли Линукса на десктопах.

Оригинал новости: http://www.omgubuntu.co.uk/2016/10/linux-marketshare-2-percent-3rd-month-row

 , два процента,

KennyMinigun
()

Почему в стандарте нет std::all_of (и компании) для контейнеров?

Форум — Development

Вопрос такой: что (концептуально) мешает добавить в стандартную библиотеку что-то такое:

namespace std {

template <typename Container, typename UnaryPredicate>
bool all_of(const Container& c, UnaryPrecidate p) {
    return all_of(c.begin(), c.end(), p);
}

}

Да, я понимаю, что данная версия не такая гибкая как с итераторами, однако на моей практике 90% случаев используется для всего контейнера. А добавление таких функций позволило бы писать более аккуратный код:

std::all_of(container.begin(), container.end(), [] (const T &t) { return isOk(t); }
// vs
std::all_of(container, [] (const T &t) { return isOk(t); });

 

KennyMinigun
()

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