Задать вопрос
  • Как перебрать все суммы массива?

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

    Перебирите все битовые маски (числа) от 0 до 2^n -1 (mask = 0; mask < (1 << n); ++mask).

    А внутри при подсчете суммы пройдитесь по всем позициям массива и, если i-ый бит установлен, прибавляйте текущее число. Проверить, что бит установлен можно сделав побитовое и (&) c 1 << i.

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

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Долго не мог понять что не так. (увы нет компилятора под рукой)

    В общем чисто "на глаз", если я не ошибся нигде:
    Если вы делаете два вызова с буфером размера 3. (а реальная длинна строки 5), то втором вызове ваша функция вернет вам NULL и вы (вероятно) нигде это не проверяете (проверьте на всякий случай что я тут не ошибся)

    Поясню - если буфер длиннее файла, то вы столкнувшись с тем что больше нечего читать т.е. при прочтении 0 байтов (а у вас их именно 0 будет прочитано, если файл кончился) возвращаете NULL вместо того, чтобы вернуть то, что смогли прочитать или еще что-нибудь сделать
    И, к стати, допускаете утечку - вы под line выделили память, но в случае ошибки не очищаете ее и никуда не возвращаете.

    см. https://man7.org/linux/man-pages/man2/read.2.html

    Ну и опустим тот момент что у вас строка будет распилена на несколько если не влезет в заданный размер буфера.

    Как вариант читать строку пока не кончится, по мере исчерпания буфера вызывать realloc (например с шагом в BUFFER_SIZE). Если буфер будет чуть больше полученой строки это не трагедия (опять же, если вдруг все-таки трагедия - realloc в помощь).
    Ответ написан
    Комментировать
  • Что делать если программа выдает ошибку при вводе функции double?

    @galaxy
    Неплохо было бы написать, в какой строке ошибка (а для начала оформить код нормально - в редакторе кнопка есть).
    Видимо, тут проблема return 5 * tan(x) - (10 / (x) ^ 2) - 3;
    (x) ^ 2 - это не возведение в степень, а XOR (исключающее ИЛИ). В квадрат возводить так: x*x, например
    Ответ написан
    Комментировать
  • Высвободится ли память,если использовать метод clear() у vector,который был заполнен структурами?

    beevasya
    @beevasya
    программист C++/C#
    name не освободится, будет утечка памяти.
    Если нужно освобождать память, то лучше Student делать как класс и соответственно в конструкторе создавать name и в деструкторе освобождать
    Ответ написан
    1 комментарий
  • Сумма бесконечного ряда на C++?

    @galaxy
    Как минимум:

    double eps, i, sum; -> double eps, i, sum = 0;

    i = (pow(-1,k) * (pow(x, k+2) / Fact2(k+1) * (4 * k+3)) );
    ->
    i = (pow(-1,k) * (pow(x, k+2) / Fact2(k+1) / (4 * k+3)) );


    sum +=1; -> sum += i;
    Ответ написан
    3 комментария
  • Решение задачи совсем не пойму ее?

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


    А с массивом-то сделать можете?
    Ответ написан
    Комментировать
  • Как пользоваться функцией EnumWindows?

    @none7
    #include <Windows.h>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    static BOOL CALLBACK enumWindowCallback(HWND func_hWnd, LPARAM lparam) {
        int length = GetWindowTextLengthA(func_hWnd);
    
        if (length != 0) {
            string windowTitle(length, '\0');
            GetWindowTextA(func_hWnd, windowTitle.data(), length + 1); // ANSI version and func_hWnd
            std::cout << func_hWnd << ":  " << windowTitle << std::endl;
        }
        return TRUE;
    }
    
    int main() {
        SetConsoleOutputCP(GetACP());
        EnumWindows((WNDENUMPROC)enumWindowCallback, 0);
        system("pause");
        return 0;
    }
    Ответ написан
    4 комментария
  • Как найти длину массива?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    MaxSymb Db 9
    RealSymb Db ?
    StringT db 1 dup (' ')

    Здесь должно быть StringT db 9 dup (' '), иначе ввод затрёт то что там дальше в памяти лежит.

    я пытался и делать так mov cx, InBuff[0] , mov cx, InBuff[1] без разницы.

    Эти инструкции загружают 16-битный регистр из памяти, а значение длины -- 8-битное. Правильно было бы как-нибудь так: mov cl, [RealSymb]

    len equ $ - StringT - не выходит, тоже 1 выдаёт

    Это вообще определяет константу, значение которой равно разности текущего адреса и адреса StringT. Если это делать в твоей программе сразу следом за определением StringT, то 1 и получится, потому что длина StringT у тебя -- 1 байт.
    Ответ написан
    6 комментариев
  • Переменная char. Вроде, как заменил буквы, но текст не выводится. Почему?

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

    А вообще, судя по этому коду - бросайте программирование. Не для вас это. У вас там косяк в каждой второй строчке.
    Ответ написан
    7 комментариев
  • Как сделать такой финт ушами с double?

    @Mercury13
    Программист на «си с крестами» и не только
    Почему нельзя? Пишу на Си с крестами, но там ничего специфичного нет, кроме парочки перестраховок.
    В Си++20 появился ещё и bit_cast.

    #include <iostream>
    
    union DoubleInt {
        double asDouble;
        uint64_t asInt;
    };
    
    static_assert(sizeof(double) == sizeof(uint64_t), "Strange machine with double != int64");
    
    constexpr int BITS_MANTISSA = 52;
    constexpr int BITS_EXPONENT = 11;
    constexpr int BITS_SIGN = 1;
    
    static_assert(BITS_MANTISSA + BITS_EXPONENT + BITS_SIGN == 64, "Programmer's funkup");
    
    constexpr uint64_t MANTISSA_UNIT = uint64_t(1) << BITS_MANTISSA;
    constexpr uint64_t MANTISSA_MASK = MANTISSA_UNIT - 1;
    
    constexpr int EXPONENT_SHIFT = BITS_MANTISSA;
    constexpr uint64_t EXPONENT_MAX = (uint64_t(1) << BITS_EXPONENT) - 1;
    constexpr uint64_t EXPONENT_ORIGIN = EXPONENT_MAX >> 1;
    constexpr uint64_t EXPONENT_MASK = EXPONENT_MAX << EXPONENT_SHIFT;
    constexpr uint64_t EXPONENT_SHIFTED_ORIGIN = EXPONENT_ORIGIN << EXPONENT_SHIFT;
    
    constexpr int SIGN_SHIFT = BITS_MANTISSA + BITS_EXPONENT;
    constexpr uint64_t SIGN_MASK = uint64_t(1) << SIGN_SHIFT;
    
    int main()
    {
        DoubleInt x { -3.45 };
    
        // Простите уж, без денормализованных чисел
    
        // Оставим знак и мантиссу
        DoubleInt xMantissa = x;
        xMantissa.asInt &= (MANTISSA_MASK | SIGN_MASK);
        // И добавим туда стандартный нулевой порядок
        xMantissa.asInt |= EXPONENT_SHIFTED_ORIGIN;
    
        // Извлечём порядок
        int exponent = ((x.asInt & EXPONENT_MASK) >> EXPONENT_SHIFT) - EXPONENT_ORIGIN;
    
        std::cout << xMantissa.asDouble << "*2^" << exponent << std::endl;
    
        return 0;
    }
    Ответ написан
    1 комментарий
  • Как удалить все объекты производных классов по общему полю в динамическом массиве?

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

    Сейчас вы в Delete передаете первый элемент массива (его значение), а не указатель на сам элемент, как массив. Далее, даже если вы там исправите на массив указателей, изменение внутри функции Delete снаружи видны не будут, потому что вы просто переписываете переданный по значению указатель. Если уж хотите с Сишными массивами работать, то вам там придется передавать указатель-на-указатель-на-указатель. Говнокод же получается, передавайте ссылку на вектор указателей.

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

    Ну и зачем вам виртуальное GetDest, если оно нигде не перегружается наследником?
    Ответ написан
    7 комментариев
  • Как создать каталог, название которого состоит из переменной?

    0hquazEd
    @0hquazEd
    Ошибка у тебя потому что ты пытаешься применить оператор "+" к двум С-строкам.

    #include <iostream>
    #include <filesystem>
    
    int main(int argc, char** argv)
    {
    	std::cout << "Enter your login: " << std::endl;
    
    	std::string login;
    	std::getline(std::cin, login);
    
    	std::filesystem::create_directory("D:/Test/" + login);
    
    	return 0;
    }
    Ответ написан
    1 комментарий
  • Как заставить GCC не использовать SSE-инструкции с выравниванием для операндов в стеке?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Логичнее было бы воспользоваться опцией -mstackrealign чтобы выравнивать стек на входе в функцию.
    Ответ написан
    2 комментария
  • Как настроить перерисовку окна диалога при его деактивации [MFC C++]?

    SerJook
    @SerJook
    кодер
    Попробуйте переопределить ON_WM_NCACTIVATE и ON_WM_ACTIVATE:

    void CMFCApplication1Dlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) {
        Default();
    }
    
    BOOL CMFCApplication1Dlg::OnNcActivate(BOOL active)
    {
        if (m_nFlags & WF_STAYACTIVE)
            active = TRUE;
        return(BOOL)DefWindowProc(WM_NCACTIVATE, active, 0L);
    }


    Взято отсюда: https://stackoverflow.com/questions/53768653/mfcs-...
    Ответ написан
    Комментировать