Ответы пользователя по тегу C++
  • Почему транслятор ожидает указатель в моем коде?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Параметр функции int arr[],

    Но далее у вас arr[i][j]. Компилятор пытается взять индекс j, но перед ним же уже число. Вот он вам и говорит "начальника, индекс я у массива (указателя) взять могу, а тут число, непонятно".

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Зависит от того, как вы компилируете B. Если A туда не линкуется статически, то его придется отдельно указывать при компиляции EXE.
    Ответ написан
  • Как отсортировать данные структуры по алфавиту?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас заводится переменная str, и как и компилятор вам говорит, вы ее ничем не инициализируете. А ниже используете в strcpy(str, sot[i - 1].familia). Эта функция принимает указатель на область памяти, куда надо скопировать строку. Но указатель указывает на случайное место. Т.е. программа, даже если чудом скомпилируется, упадет с исключением.

    Вам надо или для str выделять память через malloc, или объявить str массивом char фиксированного размера, как поле familia у структуры.
    Ответ написан
    Комментировать
  • Теряются/бьются UDP пакеты на localhost, так и должно быть?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно. Называется это - длинная арифметика (по ссылке есть пример реализации). Придется самостоятельно хранить цифры числа в массиве и выполнять сложение/умножение/вычитание в столбик, циклами. Можно хранить десятичные цифры (быстрый вывод, медленнее счет) или двоичные, например, по 32 бита в ячейке массива (быстрее работа, при выводе придется переводить в десятичную систему счисления).

    Для поиска простых чисел лучше восспользоваться каким-то тестом на простоту, например тест Миллера-Рабина
    Ответ написан
    Комментировать
  • Не компилируется код. Как исправить ошибку?

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

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

    Если вы хотите получить из кода символа цифры ее значение, то можно, например, вычесть код символа '0'.
    Ответ написан
    Комментировать
  • Почему конструктор по умолчанию считается удаленным для моего класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    PurifiedElement_Constants не имеет конструктора по умолчанию (очень неудобные названия у вас ElementPurified_Constant vs PurifiedElement_Constants - обратите внимание, ошибка не про ваш класс, а про тип _properties).

    Т.е. член _properties в вашем классе нельзя сконструировать без каких-то параметров.

    Вам надо в вашем конструктрое класса явно вызывать конструктор _properties с какими-то параметрами:
    Machinarium::Materials::ElementPurified_Constant::ElementPurified_Constant()
        : _properties(some, valid, parameters)
    {
    }
    Ответ написан
    4 комментария
  • Как называть указатели?

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

    Если же у вас будет какая-то функция, которой нужен указатель, то ей можно аргуаментом указать Conteiner* conteiner или еще что там больше по смыслу подходит.
    Ответ написан
    Комментировать
  • Задача Иосифа с++ с помощью циклического связного списка проблема со связью во 2 очереди?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо же выводить удаляемый элемент, да? Вы же выводите предыдущий. Ну и, раз первый всегда удаляется в начале, надо перед вашим циклом его вручную удалить. Может быть проще, если вы сделаете двусвязный список и напишите функцию, которая удаляет элемент и возвращает следующий. Лучше будет использовать цикл do while в решении - удаляете элемент и сдвигаетесь. Потом проверка на сколько осталось элементов... Ну или for можно использовать - вы же знаете, сколько удалений будет из n войнов.
    Ответ написан
  • Bitmap.Save(L"g.png", &png); не работает. Почему?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    А оно компилируется вообще? Save вроде как принимает 3 параметра. Можно NULL передавать там.

    Проверьте, что Save возвращает-то. Оно ошибку никуда писать и не будет - оно ждет что вы посмотрите на результат.
    Ответ написан
  • Как расположить буквы русского алфавита в порядке от 1 и 32 и работать с их порядковыми номерами?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Буквы русского алфавита (кроме 'ё') - идут в алфавитном порядке практически во всех кодировках.

    Т.е. вам надо просто вычесть код буквы 'а' из полученной буквы и вы получите число от 0 до 31. Если вам надо с 1 до 32, то прибавьте 1.

    Осталось понять, какой код у буквы 'а'. Это зависит от кодировки. Можете в вашей программе вывести введенные буквы, преобразовав их к int. Передайте ей буквы 'а' и вы получите число, которое вам можно захардкодить в вашей программе.
    Ответ написан
    Комментировать
  • Как в c++ побитово просчитать int?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Что бы взять i-ый бит справа, надо сдвинуть число на i позиций вправо и наложить маску с одной еденицей в конце через побитовое И:
    (x >> i) & 1

    Вам надо циклом пройтись по битам от старшего (7, если один байт) до младшего с номером 0 и брать конструкцию выше.
    Ответ написан
    Комментировать
  • Как fill принимает массив умноженный на long long?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Арифметика указателей. Это получается указатель на за-последним элементом массива, как ::end() у коллекций.
    Ответ написан
    Комментировать
  • Как реализовать шифрование шифром гаммирования по модулю 2?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Какой ужасный алгоритм! Лучше запихнуть первые два массива в hash-set (std::unordered_set). А потом при проходе по третьему массиву просто проверить, что этот элемент есть в первых двух set-ах.

    Если элементы могут повторятся, но выводить надо только один раз, то заведите еще один unordered_set, куда добавляйте элементы, которые вы добавили в ответ. Естественно, перед добавлением элемента в ответ, проверьте, а не содержится ли он уже в этом set-е.

    И код получится раз в 10 меньше и работать будет на пару порядков быстрее.
    Ответ написан
  • Как найти точки пересечения 2х фигур с++?

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

    upd: На этом же сайте есть все что нужно для проверки пересечения окружности и отрезков.
    Ответ написан
    2 комментария
  • Как в шифре с магическим квадратов заполнить пустые клетки произвольным символом?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    b = func(a);

    Вот тут вы взяли ссылку, которую вернула func и скопировали значение в переменную b. Поэтому ниже &b выведет вам адрес переменной b, а не то, что вы хотели.

    Возвращать ссылки бывает удобно, когда надо вернуть значение без копирования и оно всегда существует. Потому что функция, возвращающая указатель, вообще говоря, может вернуть и nullptr. По уму, надо бы этот указатель проверить перед разыменованием. А вот ссылки - они всегда куда-то указывают.
    Ответ написан
    3 комментария
  • Справа налево или слева направо представляются данные в виде битов в ячейках?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Правильный ответ - ни так и не эдак. Никак. Сравнивать указатели не из одного и того же массива - undefined behavior. Это было недавно в статье на хабре. Там ссылаются на раздел 3.3.8, "Relational operators".

    Более того, у вас там в программе еще UB: нельзя обращаться к данным в переменной long через указатель short - Это нарушение strict aliasing.

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

    На практике - никаких лево и право там не существует, есть только младшие и старшие адреса, читайте про big/little endian порядки байт. Они там бывают и так и эдак в разных архитектурах. В x86, например, младший байт имеет меньший адрес.
    Ответ написан
    Комментировать