Задать вопрос
  • Почему префиксный инкремент в логическом выражении не прибавляет единицу после вычисления?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что i++ == 0, что приводится к false. Значит второй член конъюнкции (++j) вычислять смысла нет, результат от него не зависит. Первый член дизъюнкции false, значит вычисляем второй (k == 0). Он тоже false, поэтому вычисляем третий (l++) и берём его значение как результат выражения.
    В общем, конъюнкция (&&) вычисляется до первого встреченного false, дизъюнкция (||) - до первого встреченного true.
    Ответ написан
    Комментировать
  • Какие есть плагины для Eclipse IDE/C++ для удобной работы?

    gbg
    @gbg
    Любые ответы на любые вопросы
    1) Удаление Эклипса
    2) Установка Clion/Visual Studio
    Ответ написан
    1 комментарий
  • Что нужно, чтобы стать junior-разработчиком или компании взяли на работу в качестве стажёра?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Но каких-либо понятий о них у меня нет, а также пособия по ним не могу найти.

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

    https://www.ozon.ru/context/detail/id/144895863/
    https://www.ozon.ru/context/detail/id/24939188/
    https://www.ozon.ru/context/detail/id/146287471/
    https://www.ozon.ru/context/detail/id/140939231/
    Ответ написан
    Комментировать
  • Почему работает (++i)++, но не работает ++(i++)?

    15432
    @15432
    Системный программист ^_^
    (i++) возвращает число, константу, если упрощенно. Которую нельзя инкрементить, потому что это не переменная

    (++i) же возвращает ссылку на переменную, которую можно инкрементнуть ещё раз.

    например, ++(++i) - можно. (i++)++ - нельзя.
    Ответ написан
    3 комментария
  • Как возвращать ошибку в std::filesystem?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Например, есть вот такая дописка на https://en.cppreference.com/w/cpp/filesystem/files...
    In order to ensure that copy functions of filesystem_error are noexcept, typical implementations store an object holding the return value of what() and two std::filesystem::path objects referenced by path1() and path2() respectively in a separately-allocated reference-counted storage.

    Currently the MS STL implementation is non-conforming: objects mentioned above are stored directly in the filesystem object, which makes the copy functions not noexcept.


    из которой следует, что объект исключения не стоит столь вольно копировать
    Ответ написан
    3 комментария
  • Как задать приоритетную очередь с пользовательским cmp?

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

    У шаблона std::priority_queue 3 параметра - тип элемента, контейнер и компаратор.
    priority_queue хранит элементы в заданном контейнере, поддерживает там какую-то свою структуру (кучи) используя переданный компаратор для быстрой реализации операций приоритетной очереди.

    Дефолтный контейнер - vector и компаратор стандартный std::less, поэтому работает просто priority_queue, например.

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

    Однако, если вам надо поменять только компаратор (третий параметр), то передать второй параметр тоже придется. Ну, вот перепутали порядок параметров разработчики стандарта. Нельзя задать компаратор, не задав и контейнер. Поэтому, надо писать там vector<> во втором параметре.

    Edit. Там же в документации написано, что компаратор должен возвращать true, если первый элемент строго меньше второго. Ваш пример компаратора - похоже правильный. Однако, учтите, что очередь выдает сначала максимальный элемент. Т.е, если вам нужна очередь на минимум, то вам надо поменять знак в компараторе.
    Ответ написан
    Комментировать
  • Стоит ли сегодня новичку изучать C/C++?

    gbg
    @gbg
    Любые ответы на любые вопросы
    И так, случайные чуваки из интернета, перед вами человек, о знаниях, умениях, навыках и способностях вы ничего не знаете.

    И он спрашивает вас - а стоит ли мне заниматься X?

    НУ ОТКУДА МЫ ЗНАЕМ, стоит ли вам заниматься X? Вот я программирую уже больше 20 лет, 16 из них я программирую на C++, 14 - получаю за это зарплату в виде пяти, а потом и шестизначной суммы

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

    Вам этот ответ как-то поможет? Особенно если у вас нет желания углубленно ковыряться в тонкостях архитектуры вычислительных систем и радоваться лишним выжатым из процессора миллисекундам?

    Если у вас есть желание работать типа в айти 5/2 с 9 до 18, получать стабильные 90к рэ в месяц - есть более "легкие" пути.

    Чем грозит неправильный выбор при высокой зарплате? Размазыванием слез и других жидкостей по хабру в духе "ребята, мне 25 годиков, на мне жена, дите, ипотека, я получаю три штуки баксов в месяц, но я совсем выгорел, у меня депрессия, тревога, импотенция, жена говорит, что я эмоционально холоден к ней, изменяет и грозит разводом...

    КАКОГО ПСИХОТЕРАПЕВТА МНЕ ВЫБРАТЬ, ШТОБ ПОМОХ?"
    Ответ написан
    4 комментария
  • Как решить эту задачу, используя массив char'ов?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ну... читайте по одному символу. Можно считать, допустим, начала слов. Что такое начало слова? Это символ-буква, перед которым стоит не буква. Все, что вам надо хранить - это был ли буквой предыдущий символ. Если предыдущий не был, а текущий - является, то прибавляете 1 к ответу. Еще надо аккуратно рассмотреть случай слова в самом начале (т.е. фактически прибавляете 1 если текущий - буква и позиция == 0 или предыдущий символ - не буква).
    Ответ написан
    Комментировать
  • Ошибка munmap_chunk(): invalid pointer Process finished with exit code -6. Что делать?

    int *firstarray = new int(size);
    Так вы создайте указатель не на массив, а на int со значением size. Скорее всего вы хотели сделать так:
    int *firstarray = new int[size];
    Ответ написан
    Комментировать
  • Как определить количество повторяющихся элементов в массиве?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Увы, это только так и работает (для общего случая строк). Если вам можно использовать stl, задействуйте std::map примерно таким образом

    std::vector<std::map<char, size_t>> maps(strings.size());
    
    size_t nmax = 0;
    size_t fmax = 0;
    
    for(size_t i=0;i<strings.size();++i)
    {
        for(const auto& j:strings[i])
        {
            const size_t current = ++maps[i][j];
            if(current>fmax)
            {
                fmax=current;
                nmax=i;
            }
        }
    }
    
    //теперь в nmax у нас номер строки с максимально частым повторением
    Ответ написан
    2 комментария
  • Почему значения меняются?

    @res2001
    Developer, ex-admin
    Потому что массив так нельзя вернуть из функции. Сейчас вы просто возвращаете указатель. Пока указатель находится в функции getMas он действительно указывает на массив. Как-только вы вышли из getMas стек схлопнулся (ваш массив находится на стеке) и память, где раньше лежал массив стала не действительной.
    После вызова первого printf, та же память на стеке, которую когда-то занимал ваш массив выделилась под нужды printf, и printf заполнила эту память чем-то своим, поэтому в третьем printf у вас фигня.
    Программа у вас не вываливается с ошибкой, потому что в стеке память всегда выделена. "Схлопывание стека" - это просто уменьшение/увеличение регистра указателя на стек.

    У вас есть 2 вариант.
    1. Простой - выделить массив в main, передать его в getMas. Из getMas уже можете ничего не возвращать, только заполняете там массив.
    2. Выделяете динамический массив в getMas с помощью malloc. В main не забудьте освободить память, выделенную для массива. Это плохой вариант, т.к. память выделяется на одном уровне программы, а освобождается на другом. Но в вашей простой задаче можно пока на это не обращать внимания.
    Ответ написан
    Комментировать
  • Почему значения меняются?

    Вы возвращаете висячий указатель, поэтому возникает неопределённое поведение
    Ответ написан
    Комментировать
  • Почему не присваиваются значения с++?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Потому что вы передаете по значению (это означает, что функция получит копию аргумента), а надо передавать по ссылке:
    int input(TComplex& a, TComplex& b, TVect& first, TVect& second, float& one )
    {
    Ответ написан
    Комментировать
  • Как запустить исполняемый файл, тк выдает ошибку msvcp140.dll?

    15432
    @15432
    Системный программист ^_^
    Ставьте Microsoft Visual C++ Redistributable Packages for Visual Studio 2015

    или собирайте .exe статически
    Ответ написан
    Комментировать
  • Почему мне видает nan?

    15432
    @15432
    Системный программист ^_^
    Синус/косинус может принимать только значения от -1 до 1

    у вас он почему-то 2.5
    Ответ написан
    5 комментариев
  • Как оптимизировать парсинг цвета для библиотеки NeoPixels на arduino?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    1) Упростить алгоритм передачи, убрать по максимуму служебные поля
    2) Гнать данные в сыром бинарном формате (что пришло, то и пуляется в ленту), а не "человекопонятном" с кучей преобразований
    3) Возможно имеет смысл готовить несколько кадров за раз, оптимально использовать размер пакета данных того протокола через который данные перегоняются, чтобы, опять же, сэкономить на служебных данных
    Ответ написан
    Комментировать
  • Ошибка "C++ requires a type specifier for all declarations" Что делать?

    На 7 строке: main() заменить на int main()
    Ответ написан
    Комментировать
  • Какие библиотеки и фреймворки стоит изучить в c++?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Бесполезно учить библиотеки - это примерно как учить телефонный справочник - вроде знаний много, и они полезные, но пользу из них можно извлечь только тогда, когда кому-то нужен телефон Иванова.

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

    То есть, нужно сформировать у себя способность решать задачи на C++ и искать информацию в интернете.

    Попросят вас нарисовать текстурированный вертящийся кубик - вы буквально эту формулировку можете набить в гугл, оттуда получить сведения о том, что кубики можно рисовать вручную, написав весь 3d код самостоятельно (это интересно и увлекательно, кстати), или есть три кита opengl, d3d и vulkan, которые рисуют

    На этом этапе вы можете взять любой из троицы, поискать начальные уроки и попытаться попользоваться библиотекой.

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

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Никак. Одна из функций ОС - не разрешать подобного.
    Ответ написан
    Комментировать