Задать вопрос
  • Как исправить ошибку "src refspec master does not match any"?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Нет ветки master, вот и ругается. Ветка по умолчанию на GitHub теперь называется main.

    Команда git branch -vv покажет какие ветки есть локально и с какими внешними ветками связаны.
    * main 0e02250 [origin/main] v.01

    Надо было делать git push origin main
    Либо просто git push т. е. отправить текущую ветку в связанную с ней ветку на внешнем репозитории.
    В нашем случае текущая ветка main (помеченная звёздочкой)
    отслеживает исходную ветку main в репозитории обозначенном как origin

    Что скрывается за сокращением origin покажет команда git remote -v
    origin	https://github.com/xxx/xxx.git (fetch)
    origin	https://github.com/xxx/xxx.git (push)
    Ответ написан
    Комментировать
  • Почему scanf_s("%[^3]", str) при считывании символа '3' просто останавливается на этом символе, а не переходит к следующему?

    @dima20155
    you don't choose c++. It chooses you
    Потому что так реализовано:

    [set]
    matches a non-empty sequence of character from set of characters.
    If the first character of the set is ^, then all characters not in the set are matched. If the set begins with ] or ^] then the ] character is also included into the set. It is implementation-defined whether the character - in the non-initial position in the scanset may be indicating a range, as in [0-9]. If width specifier is used, matches only up to width. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters)


    Ссылка

    Если вам не нужно "зависать" на символе, то используйте другой формат, например %c, %s (симолы/строки)
    Ответ написан
    7 комментариев
  • Почему fopen устанавливает ошибку Invalid argument в errno при fopen в режиме r+ после w и fopen в режиме w+ после r?

    @res2001
    Developer, ex-admin
    Интересный вопрос. Ответа у меня нет, что-то не приходилось использовать режимы "+".
    Попробуйте обнулять errno перед вызовом fopen. Возможно значение, осталось от предыдущего вызова. Вообще читать errno надо, только если fopen вернул NULL. При нормальном завершении errno не меняется.
    И если pFile == NULL, очевидно, что не надо вызывать fclose.
    Ответ написан
  • Почему 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
    Дома с переломом ноги
    Можно ли обойтись без использования 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 комментария