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

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    sscanf("Hello hello,sdaadsasdre,23", "%[^,],%[^,],%d", str_1, str_2, &num_1);

    Об этом и многом другом можно узнать из man scanf.
    Ответ написан
    1 комментарий
  • Можно ли слинковать 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
    Ответ написан
    Комментировать
  • Как исправить ошибку в формуле?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Зачем брать тригонометрические функции от компонентов направления взгляда? Если нужно двигаться в направлении взгляда, следует прибавлять к позиции камеры произведение скорости на нормированный вектор направления взгляда на продолжительность одного кадра.
    Ответ написан
  • Не могу найти ошибку в использовании 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
    Ключевое слово для поиска -- "триангуляция".
    Ответ написан
    Комментировать
  • Как работают исключения?

    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.
    Ответ написан
    Комментировать
  • Как отловить нажатие двух клавиш WinApi?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    код в проверке выполняется при нажатии совершенно любой клавиши, а не по "A" и "W". Как быть?

    Просто прочитайте описание WM_KEYDOWN. wParam -- это не битовая маска, это код клавиши, не надо писать if(keyid & 0x41), надо писать if(keyid == 0x41).
    Ответ написан
    9 комментариев
  • Почему не работает сортировка пузырьком в массиве?

    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 комментария