• Почему space 32 в ascii называется printable?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Символы с кодами от 0 до 31 куда входит ТАБ являются управляющими символами (comma control / control symbold). И их задача - вызывать разные эффекты при выводе строки на экран. Звук. Backspace. Движения
    курсора в разные стороны. Поэтому данный диапазон символов не рекомендуется к оформлению текста. Потому что при печати текста на принтер например - эффект непредсказуем. Многие из них были частью сетевых протоколов и сейчас уже не используются.

    Символ табуляции в середине 20-го века использовали для оформления исходников на ассемблере
    ради экономии места. Это было удобно. Когда вся память ПК мерялась десятком килобайт - надо было
    экономить даже на тексте программы. И это реально работало. В современной разработке вообще
    нет необходимости использовать TAB (0x09). Ну разве что в Makefile он по старинке еще используется.
    Но мейк делали такие длинно-бородые колдуны что там нет диалога о модернизации. Часть колдунов
    уже померли. А оставшимся пофиг.

    Еще иногда символ TAB я встречаю в экспортах баз данных в формате TSV (Tab-Separated) но
    честно говоря на экране такой дамп выглядит ужасно. Все равно по 1 линии выравнивание не
    получается. Поэтому втопку такое.

    Сегодня в современнных IDE символ табуляции автоматически заменяется на серию пробелов. Поэтому
    смысла спорить о ТАБ нет никакого. Потому что и символа то уже нет. Есть просто клавиша которая
    имеет семантику добивания пробелов.

    UPD: Для исходников типа Python/Scala TAB (0x09) может создавать проблемы. Особенно когда идет
    микс отступов например одна строка TAB а другая spaces. Это сложные невидимые глазами
    проблемы. Только компиллятор увидит и ругнётся. Поэтому - выпиливайте ТАБы как сорняк.
    Чем скорее - тем лучше.
    Ответ написан
    1 комментарий
  • Почему внутри шаблона можно иметь доступ к приватному члену внутреннего класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    С чего вы взяли, что внутри шаблона это работет? Вы его инстанциировать пробовали (объявить переменную класса Outer<int>, например)?

    Вылезает точно такая же ошибка.

    Если шаблон просто написать, но не использовать его, то он компилироваться и не будет и ошибки в нем не обнаружатся.
    Ответ написан
    1 комментарий
  • Почему сортировка вставкой работает быстрее сортировки выбором в самом сложном случае?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Какого размера у тебя массивы? Там для маленьких - вообще теоретическая формула не работает.
    Видимо в силу когерентности кеша тупые и жлобские алгоритмы работают лучше чем умные и сложные.

    Я думаю что теоретическая оценка начинает играть роль тогда, когда массив реально в несколько крат
    превышает хотя-бы кеш L3.

    Я для мелких массивов (2,3 элемента) сортировка пузырем вполне себе делает минимум операций.
    Ее даже можно хардкодить размоткой циклов.

    Есть также вопросы на собеседовании для джунов (Java) которые практически позволяют нагнуть новичка
    показав ему на практике что вставка примитива в ArrayList (массив) работает быстрее чем вставка в LinkedList.

    Опять-же этот эффект заметен на малых размерах массивов.
    Ответ написан
    3 комментария
  • Почему компилятор не предупреждает о преобразовании int в uint8_t?

    @serhiops
    Python/JavaScript/C++
    При unform инициализации проверяется тип, чего не происходить при инициализации копированием
    Ответ написан
    3 комментария
  • Каковы правила конвертации указателя на массив неопределенной длины в указатель на массив определенной длины?

    @code_panik
    В выражении p = p2 мы выполняем неявное преобразование встроенных типов, для которых в стандарте не описаны правила преобразования. То есть такое преобразование не гарантировано, но может быть реализовано компилятором, например
    #include <type_traits>
    using namespace std;
    
    int main() {
        static_assert(std::is_convertible<int(*)[2], int(*)[]>::value, "Non-convertible");
        return 0;
    }

    компилируется в gcc 12.2, в clang 15.0 - ошибка.

    Существует старое не принятое предложение о закреплении такого преобразования стандартом.
    Ответ написан
    1 комментарий
  • Каковы правила конвертации указателя на массив неопределенной длины в указатель на массив определенной длины?

    Adamos
    @Adamos
    С++ - язык более высокого уровня, тут компилятор не позволит вам выстрелить себе в ногу неявным приведением сена к соломе. Нужно объявить его явно.
    static_cast - если компилятор готов согласиться с вами, что одно можно просто привести к другому во время компиляции.
    dynamic_cast - если вы приводите указатель на родительский класс к указателю на дочерний
    и reinterpret_cast - если вы приводите по-сишному, "ногой в дверь", уверены в себе и не нуждаетесь в подсказках компилятора насчет того, что делаете.
    Ответ написан
    4 комментария
  • Почему часто можно встретить отступление от структурного подхода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Первый вариант легче читается. Особенно, если вариантов раннего выхода из функции несколько. Потому что меньше вложенность проверок, сразу видно что и при каких условиях возвращается.
    Ответ написан
    Комментировать
  • Почему компилятор не генерирует конструктор по умолчанию в отдельной единице трансляции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему компилятор не генерирует конструктор

    потому что нигде не написано, что он должен? Я вижу, что в коде генерируемом gcc инициализация таблицы виртуальных функций инлайнится по месту создания объекта, вне зависимости от опций оптимизации.
    Ответ написан
    1 комментарий
  • Почему можно не указывать virtual в файле реализации?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему можно не указывать virtual в файле реализации?

    Не то чтобы "можно не указывать". Нужно не указывать. Потому что так говорит стандарт.
    И потому что виртуальность функции -- это не свойство функции, а свойство класса которому она принадлежит. Код функции не зависит от того, виртуальная она или нет.
    Ответ написан
    4 комментария
  • Почему msvc оптимизирует конструкторы несмотря на флаги?

    @code_panik
    Разберемся, в каком порядке выводятся сообщения на экран во втором случае gnu++11.
    Сначала в main вызываются два конструктора по умолчанию: для imnotdumb1 и временного объекта dumb_array();.
    Далее в main вызывается метод dumb_array & operator=( dumb_array temp), в котором temp инициализируется посредством метода dumb_array (dumb_array&& other), который перед выводом на экран сообщения operator=( dumb_array tmp) вызывает ещё один конструктор по умолчанию.
    Итого 3 конструктора по умолчанию, один перемещения, один оператор присваивания.

    MSVC вызывает первые два конструктора по умолчанию и применяет move elision к инициализации temp.
    То есть весь пример сводится к такому коду
    #include <iostream>
    using namespace std;
    
    struct Foo {
    	Foo() { cout << "default ctor\n"; }
    	Foo(Foo&& arg) { cout << "move ctor\n"; }
    };
    
    void foo(Foo arg) {
    	cout << "foo\n";
    }
    
    int main () {    
    	foo(Foo());
    	return 0;
    }


    В c++ существуют обязательные (mandatory) и необязательные случаи copy/move elision, https://en.cppreference.com/w/cpp/language/copy_elision.
    Применение правила из примера
    In the initialization of an object, when the source object is a nameless temporary and is of the same class type (ignoring cv-qualification) as the target object.

    до c++17 было необязательным к реализации, на усмотрение разработчиков компилятора.
    В Microsoft считают такое правило обязательным вне зависимости от флагов компиляции,
    Mandatory copy/move elision in Visual Studio

    The C++ standard requires copy or move elision when the returned value is initialized as part of the return statement (such as when a function with return type Foo returns return Foo()). The Microsoft Visual C++ compiler always performs copy and move elision for return statements where it is required to do so, regardless of the flags passed to the compiler. This behavior is unchanged.


    До c++17 требовалось, чтобы соответствующий copy/move ctor в случае copy elision всё равно был доступен (cppreference, там же):
    This is an optimization: even when it takes place and the copy/move (since C++11) constructor is not called, it still must be present and accessible (as if no optimization happened at all), otherwise the program is ill-formed
    Ответ написан
    1 комментарий
  • Кроссплатформенное программирование на C?

    @res2001
    Developer, ex-admin
    Тут не важно GUI или нет (может быть любой интерфейс - сеть, файлы, потоки, процессы, и т.п. системные интерфейсы). Подход один и тот же. Если нужна кроссплатформенность, то ищите кроссплатформенные библиотеки, реализующие нужный интерфейс. Если таких нет (видимо плохо искал), то пишите свою. Это довольно сложно.
    Ответ написан
    Комментировать
  • Как создать кастомное кроссплатформенное окно на си?

    includedlibrary
    @includedlibrary
    Надо либо использовать библиотеки GTK, QT и т.п., либо писать свою реализацию под каждую ОС
    Ответ написан
    Комментировать
  • Как создать кастомное кроссплатформенное окно на си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Можно ли обойтись без использования WinAPI?

    Нужно. Если не хотите лабать под кажду платформу свой код.

    Здесь нужно различать два случая:
    - хочу написать кроссплатформенное приложение, пофиг на чем
    В этом случае берут Qt, Gtk иже с ними и пишут. Там уже обеспечили кроссплатформенность

    - хочу написать кроссплатформенное приложение без сторонних библиотек
    В этом случае придется изучать механизмы отрисовки окон (и скорее всего опять-таки лабать под каждую платформу свой код)
    Ответ написан
    Комментировать
  • Почему нет доступа к приватному атрибуту?

    У вас оператор является private членом класса. А надо public. О чем и говорит компилятор.
    Ответ написан
    3 комментария
  • Почему msvc оптимизирует конструкторы несмотря на флаги?

    @dima20155
    you don't choose c++. It chooses you
    У microsoft какая-то муть с RVO (или это я слишком глупый), сам недавно отлавливал баг с RVO. Правда баг был в дебаггере. GDB норм все показывал, а MSVS нет.
    Попробуй отключить RVO оптимизацию /Zc:nrvo- и напиши что будет.
    Ответ написан
    3 комментария
  • Как откатить средства сборки проекта?

    @kokapuk Автор вопроса
    Нашел ответ, нужно просто сменить набор инструментов для платформы.
    Проект > Свойства > Общие > Набор инструментов для платформы
    Ответ написан
    1 комментарий
  • Как работает %[^\n]s?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Верно ли я понимаю, что первый scanf читает поток и останавливается на \n , после чего каждый последующий вызов scanf начинает чтение с этого же символа (\n) и, следовательно, моментально останавливается

    Понимаешь верно. Вдобавок форматная строка %[^\n]s содержит символ s который никогда не заматчится, потому что %[^\n] останавливается на символе '\n'. Логично было бы заменить её на %[^\n]%*c чтобы работало так, как было задумано.
    Ответ написан
    3 комментария
  • В каком порядке изучать Java?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Начни с новичкового курса по Java Core с большим количеством задач с автопроверкой, например, javarush.com. Задачи решай сразу в IDEA, нафиг советчиков с блокнотами и эклипсами. Привыкай к профессиональному инструменту, смотри подсказки, учи шорткаты. Много задач нужно чтобы руки и глаза привыкли к синтаксису и конструкциям языка.
    Параллельно можешь взять этот курс.
    Когда плюс-минус освоишь коллекции параллельно осваивай SQL.
    Когда дойдёшь до join, параллельно начни учить Spring.
    Посмотри видео на ютупе (Евгений Сулейманов, letscode) о том как в принципе собираются простые проекты, что за чем, в какой последовательности.
    Когда процентов на 70-80 пройдёшь эти курсы начни ходить на собесы (искать стажировку можно и раньше), решай тестовые задания, выписывай что спрашивают, доучивай это.
    Удачи!
    Ответ написан
    Комментировать
  • Не могу вывести Hello в консоль?

    @dima20155
    you don't choose c++. It chooses you
    Вы работаете в VS IDE и у вас, видимо, в другом файле в вашем проекте уже определена функция main.
    Самый простой выход - создайте пустой проект (а не консольный) и напишите ваш код
    Ответ написан
    Комментировать
  • Почему std::swap вызывает конструктор перемещения?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Чтобы поменять два значения местами, надо сначала одно значение переложить в какую-то временную перменную. Вот тут и вызывается конструктор.

    void swap(T &a, T &b) {
      T tmp{std::move(a)};
      a = std::move(b);
      b = std::move(tmp);
    }
    Ответ написан
    8 комментариев