Ответы пользователя по тегу C++
  • Как изменить запись в файле c++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    открыть для "r+b", перейти к нужной записи через fseek, записать нужные данные с помощью fwrite.
    Ответ написан
  • Можно ли слинковать 32-битный .so с 64-битным?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Правда?

    Правда.

    может есть лазейка

    Нет. Без шансов.
    Ответ написан
    Комментировать
  • G++ версий 6-7, собирает не исполняемые файлы, а разделяемые библиотеки. Почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    g++ последних версий в linux собирает разделяемые библиотеки, а не исполняемые файлы

    Регулярно собираю g++ (правда не под x86), ничего такого не наблюдаю.

    В /bin большинство софта собрано как разделяемые библиотеки. Ощущение, что я что-то пропустил.

    Это не разделяемые библиотеки, это position-independent executable, исполняемые файлы с релокациями. В дистрибутиве включили -pie по умолчанию, чтобы рандомизировать пользовательское адресное пространство. См. https://wiki.ubuntu.com/Security/Features#Built_as_PIE
    Ответ написан
    Комментировать
  • Не могу найти ошибку в использовании long double в C?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Но в итоге все равно какие-то совсем другие цифры получаются.

    Т.е. вы знаете наверняка, что y имеет другое значение? Потому что, на мой взгляд, логика изменения y в цикле немного странная.
    Ответ написан
    2 комментария
  • Как найти количество различных элементов в рандомном массиве (С++)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В массиве M(k) много совпадающих элементов. Найти количество различных элементов в нем.

    Уточни пожалуйста, в массиве 1, 1, 2 сколько различных элементов -- 1 или 2?
    Я попытался было понять по твоему коду, но не смог.

    for (int h=0; h < n+1; h++) {
    if (a[i] != a[h] && i!=h)


    Вылез за пределы массива a.
    Ответ написан
  • Как устранить утечку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    return *new obj (this->a + xa.a);

    Заменить на
    return obj (this->a + xa.a);

    P.S. с исключениями-то разобрался?
    Ответ написан
    2 комментария
  • Зачем нужны прототипы в C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    1)Заголовочные файлы: в них собраны прототипы функций библиотек?(и все?)

    Содержимое заголовочного файла просто подставляется в то место где написано #include. Поэтому туда можно поместить всё что угодно. Традиционно библиотеки помещают туда объявления классов, функций и глобальных переменных и определения макросов.

    2)Как компилятор находит нужные встроенные функции по прототипам если мы не включаем в cpp файл библиотеки а лишь подключаем заголовочный файл с помощью #include?

    Компилятор их не находит. Не его это работа. Он просто помещает в объектный код вызовы ссылающиеся на внешние символы. Во время линковки объектных файлов в исполняемый файл линковщик находит все вызванные функции в библиотеках которые ему передали для линковки.

    3)Я так понимаю прототипы в C++ нужны для того чтобы компилилось быстрее?

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

    4)Заголовочные файлы представляют из себя уже откомпиленый код?(объектный)

    Нет, это обыкновенные текстовые файлы с исходным кодом. Содержимое заголовочного файла просто подставляется в то место где написано #include. Открой один для интереса и почитай.

    5)Тот же вопрос что и в 4 только уже про библиотеки

    Да. Статическая библиотека -- это архив объектных файлов. Динамическая библиотека -- это собранные линковщиком вместе объектные файлы.
    Ответ написан
    3 комментария
  • Почему команда gcc не найдена (хотя gcc установлен)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    gсс -lgd main.c
    gсс: команда не найдена

    в слове gcc нет русских букв с.
    $ gcc
    gcc: fatal error: no input files
    compilation terminated.

    Вот тут вам удалось написать слово gcc правильно.
    $ gсс main.c
    gсс: команда не найдена

    А здесь опять с русскими с.
    Ответ написан
    Комментировать
  • Как работают исключения?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может ли кто нибудь объяснить на низком уровне, пошагово, то как работают исключения в с++?

    Вот описание части Itanium ABI связанной с раскруткой стека:
    https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html

    ABI процессоров других архитектур устроены в этом месте точно так же.

    Вот подробное описание структур, используемых при раскрутке стека в коде генерируемом gcc:
    www.airs.com/blog/archives/460
    www.airs.com/blog/archives/464

    Документы по ссылкам достаточно сложны для восприятия. Для облегчения понимания можно откомпилировать простой С++ код выбрасывающий и ловящий исключение и найти в нем части описанные в первом документе.
    Например
    void e_destructor();
    void s_destructor();
    
    struct E {
            int code;
    
            E(int c): code(c)
            {
            }
            ~E()
            {
                    e_destructor();
            }
    };
    
    struct S {
            ~S()
            {
                    s_destructor();
            }
    };
    
    void f(int v)
    {
            throw E(v);
    }
    
    int g(void (*p)(int v), int v)
    {
            try {
                    struct S s;
                    p(v);
            } catch(struct E e) {
                    return e.code;
            } catch (int i) {
                    return i;
            } catch (...) {
                    throw;
            }
            return 0;
    }

    после g++ -O2 -S превращается в следующие фрагменты:
    функция f:
    _Z1fi:
    .LFB9:
            .cfi_startproc
            pushq   %rbx
            .cfi_def_cfa_offset 16
            .cfi_offset 3, -16
            movl    %edi, %ebx
            movl    $4, %edi
            call    __cxa_allocate_exception
            movl    $_ZN1ED1Ev, %edx
            movl    %ebx, (%rax)  <---- инициализация E::code
            movl    $_ZTI1E, %esi
            movq    %rax, %rdi
            call    __cxa_throw
            .cfi_endproc

    Здесь видны вызовы __cxa_allocate_exception, конструктора объекта класса E и __cxa_throw
    функция g:
    _Z1gPFviEi:
    .LFB10:
            .cfi_startproc
            .cfi_personality 0x3,__gxx_personality_v0
            .cfi_lsda 0x3,.LLSDA10
            pushq   %rbp
            .cfi_def_cfa_offset 16
            .cfi_offset 6, -16
            pushq   %rbx
            .cfi_def_cfa_offset 24
            .cfi_offset 3, -24
            movq    %rdi, %rax
            movl    %esi, %edi
            subq    $8, %rsp
            .cfi_def_cfa_offset 32
    .LEHB0:
            call    *%rax  <--- вызов функции по указателю
    .LEHE0:
    .LEHB1:
            call    _Z12s_destructorv  <--- вызов деструктора объекта s при нормальном выходе из блока try
    .LEHE1:
            xorl    %eax, %eax
    .L17:
            addq    $8, %rsp
            .cfi_remember_state
            .cfi_def_cfa_offset 24
            popq    %rbx
            .cfi_def_cfa_offset 16
            popq    %rbp
            .cfi_def_cfa_offset 8
            ret

    Хвост с обработчиками исключений:
    .L13:
            .cfi_restore_state
            movq    %rdx, %rbx
            movq    %rax, %rbp
            call    _Z12s_destructorv
            movq    %rbx, %rdx
    .L6:
            cmpq    $1, %rdx
            je      .L8
            cmpq    $2, %rdx
            jne     .L22
            movq    %rbp, %rdi
            call    __cxa_begin_catch
            movl    (%rax), %ebx
            call    __cxa_end_catch
            movl    %ebx, %eax
            jmp     .L17
    .L14:
            movq    %rax, %rbp
            jmp     .L6
    .L22:
            movq    %rbp, %rdi
            call    __cxa_begin_catch
    .LEHB2:
            call    __cxa_rethrow
    .LEHE2:
    .L8:
            movq    %rbp, %rdi
            call    __cxa_get_exception_ptr
            movq    %rbp, %rdi
            movl    (%rax), %ebx
            call    __cxa_begin_catch
    .LEHB3:
            call    _Z12e_destructorv
    .LEHE3:
    .LEHB4:
            call    __cxa_end_catch
    .LEHE4:
            movl    %ebx, %eax
            jmp     .L17
    .L16:
            movq    %rax, %rbx
            call    __cxa_end_catch
            movq    %rbx, %rdi
    .LEHB5:
            call    _Unwind_Resume
    .LEHE5:
    .L15:
            movq    %rax, %rbx
            call    __cxa_end_catch
            movq    %rbx, %rdi
    .LEHB6:
            call    _Unwind_Resume
    .LEHE6:
            .cfi_endproc

    Здесь видны вызовы __cxa_begin_catch и __cxa_end_catch, __cxa_rethrow повторно выбрасывающий пойманное исключение, __cxa_get_exception_ptr и _Unwind_Resume, вызываемый если блок catch не ловит это исключение.

    Дальше идёт структура LSDA описанная в третьем документе.

    Сама раскрутка стека в этом коде отсутствует. Она выполняется следующим кодом libgcc: фаза 1 и фаза 2.
    Ответ написан
    Комментировать
  • Почему не работает сортировка пузырьком в массиве?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не работает сравнение среднего балла студента: (s[i].getSredne < s[j].getSredne)?

    Потому что это не вызов функции, а что-то другое. Правильно будет
    s[i].getSredne() < s[j].getSredne()
    Ответ написан
    7 комментариев
  • В чем разница между syscall setreuid в C/C++ и asm?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    в чем проблема то тогда

    а по ходу нельзя из elf64 вызывать системные вызовы через int 0x80. Так что либо замени int 0x80 на syscall (и, кстати, _NR_exit для x86_64 -- это 60), либо используй nasm -static -f elf32 и ld -m elf_i386 (и тогда _NR_setreuid будет 70).
    Ответ написан
    3 комментария
  • Как встроить в OS компилятор C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вам туда: wiki.osdev.org
    Ответ написан
    1 комментарий
  • Какие оптимизации используются в языках С и С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мне не нужен полный список низкоуровневых оптимизаций, таких как размещение переменных в регистры, а нужны такие, как вычисление константных выражений или раскрытие простых методов (get/set). Какие оптимизации в C и C++ различаются? В частности, рассматриваю gcc.

    gcc -Q --help=optimizers выведет список всех включенных в настоящий момент (другими опциями командной строки) оптимизаций. Что каждый из -f* ключей означает можно посмотреть тут: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Option...
    Ответ написан
    1 комментарий
  • Как определять новые методы в производных классах?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Но согласно общей концепции, у обычного сотрудника не может быть подчиненных. Значит метод getListEmployee() не нужен родительскому классу Person.


    Нужен метод классу или не нужен зависит от его ответственности. Если вы собираетесь использовать Person для работы с сотрудниками любого типа (кстати, плохое название класса, не отражает сути), а у каких-то сотрудников в принципе могут быть подчинённые, то какой-то метод для этого должен присутствовать в Person. Удобство использования этого интерфейса будет зависеть от реализации.

    Так, например, можно добавить метод getListEmployee(), возвращающий список подчинённых (кстати, опять плохое название метода, не отражает сути), а реализация этого метода в классе Employee может возвращать пустой список.
    Или можно добавить метод getSubordinateEnumerator(), возвращающий интерфейс перечисления подчинённых, а в классе Employee возвращать из этого метода NULL.

    Если же вы не собираетесь использовать единый интерфейс Person, а, например, будете пытаться привести Person* к типу Employee* или Manager* с помощью dynamic_cast, то метод в Person не нужен.
    Ответ написан
    4 комментария
  • Как передавать UDP пакеты через определенный интерфейс?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    пакет должен уходить в eth1, "пройти" через оборудование и попасть в eth2. Проблема в том, что система не отправляет пакеты в интерфейс и далее в оборудование, а сразу "получает" их на eth2.

    Всё верно, без фокусов эта схема работать не будет.
    Возможные фокусы:
    - посылать пакет через RAW сокет, чтобы маршрутизатор ядра не вмешивался;
    - посылать пакет не на адрес eth2, а на другой адрес. Править адрес назначения с помощью iptables, в таблице mangle, в цепочке POSTROUTING.
    Ответ написан
    1 комментарий
  • Почему не работает sscanf?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Чтобы работало с приведённой строкой, формат должен быть таким:
    sscanf(mycharp, "%[^'*']*,%[','^]", o, s);
    Исходный формат не работает, потому что обработка %[^'*'] остановится на входном символе *, и так там и останется, потому что последующая часть форматной строки не поглощает этот символ.
    Кроме того, вы, мне кажется, понаставили лишних апострофов внутри квадратных скобок. В форматной строке они интерпретируются буквально, т.е. формат "%[^'*']" означает "символы, кроме апострофа, звёздочки или апострофа". Вот так тоже должно работать:
    sscanf(mycharp, "%[^*]*,%[,^]", o, s);
    Ответ написан
    3 комментария
  • Как включить русский язык в программе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    По приведённому отрывку создаётся впечатление, что можно передать eng или ru параметром командной строки и это повлияет на значение байта byte_451fc.
    Ответ написан
    Комментировать
  • Почему в C++ нужно строить всю программу на ООП (длинный вопрос)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мне нравится код ядра Linux. Никакого разделения программы на объекты там нет, и всё там окей, прекрасно без такого разделения живут.

    Да-да-да, https://lwn.net/talks/fosdem-kobject/

    Полиморфизм есть, но он есть только там, где это нужно. И никакого "А давайте всю программу разобьём на классы, просто потому что так надо" тут нет. На мой взгляд, Linux устроен совершенно верно, именно так и нужно писать.

    Ага, только он не был таким всегда. Его текущий дизайн -- это результат эволюции. Эволюция вызвана стремлением повысить качество. Чтобы повысить качество нужно уменьшить сложность. ООП -- один из возможных путей уменьшения сложности.

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

    Сюда идеально подходит книга "Паттерны проектирования". (скан, кстати, не очень, пропущен важный кусок истории в конце). Только не надо читать про сами паттерны. Прочитай всё остальное: откуда они взялись, какова их история, как ими пользоваться.
    Ответ написан
    4 комментария
  • Почему не работает make для другого каталога?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему так происходит?

    Потому что вы что-то делаете неправильно.

    Если серьёзно -- то как вы хотите, чтобы мы поняли, что у вас происходит, если вы не дали нам никакой полезной информации? Makefile покажите, что ли.
    Ответ написан
    1 комментарий
  • Где взять готовые графические решения для разработки приложения на WinAPI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Пытался использовать GDI, но это просто ужас:
    (это можно пропустить и перейти к вопросу, выделенным жирным шрифтом)
    1) много сообщений просто не срабатывают;
    2) например, закрасило кнопку, но текст не вывело;
    3) после нажатия на закрашенное окно (в моём случае на кнопку) - оно перекрашивается в стандартный цвет;
    4) переопределили класс кнопки - в итоге на ней какой-то белый квадрат отображается (хотя код примитивный и вообще без понятия откуда взялся этот квадрат);
    5) вообще неудобно и очень много времени теряю на эти графические моменты.
    Короче, очень сильно достало уже это GDI.

    А надо всего лишь разобраться как работает отрисовка окон.
    https://msdn.microsoft.com/en-us/library/windows/d...
    Ответ написан
    Комментировать