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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ListIterator - это класс итератора, который у меня определён ниже основного класса

    Шаблон класса должен быть определён до его использования.
    Ответ написан
    Комментировать
  • Как получить указатель на функцию класса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что будет?

    В данном примере -- то же самое, как если просто написать obj->execute(), т.е. виртуальный вызов конечного переопределения для функции obj1::execute в объекте класса obj3. См. eelis.net/c++draft/expr.call#3

    Я не понимаю как это будет работать с классами наследниками и виртуальной функцией.

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему в 93 строке (bptr = (schoolboy*)&a1;) пишет progress=<Ошибка при чтении символов строки>

    Я уверен, что пишет он это на самом деле вот здесь: cout << *bptr;, а происходит это потому что bptr указывает на объект, конечный тип которого -- class student. У такого объекта в его представлении в памяти нет никакого поля progress, поэтому код который пытается его вывести ведёт себя таким образом. Вообще это пример неопределённого поведения.

    как это исправить?

    Тут явно какая-то проблема в логике. Для начала надо понять, что ты вообще хочешь чтобы произошло.
    Ответ написан
  • С чем связяна эта ошибка (SFML)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Скачал библиотеку, подключил ее в параметрах проекта

    похоже, что не до конца подключил, потому что ошибка в том, что не найдены символы из этой библиотеки во время линковки.
    Ответ написан
    2 комментария
  • Как записать в переменную типа char строку неизвестной длины из файла?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    C++
    Нужно в двумерный массив char записать эти строки

    Если это С++, то строки -- это std::string, массив -- это std::vector, используй std::getline и например std::vector::push_back.
    Если это массив char, то это C и выделение памяти по мере надобности функцией realloc.
    Ответ написан
    3 комментария
  • Где утечка памяти?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    for (size_t i = iters.size(); i < listsize; i++) {
        iters.push_back(new iterator(typesize));
      }

    для такого кода создания код удаления должен вызывать delete а не просто деструктор, т.е.
    for (size_t i = iters.size(); i > listsize; i--) {
            delete *iters.back();
            iters.pop_back();
          }


    iterator::~iterator() {
      for (stream::stream* s : usedbystreams) {
        s->killstream(0);
      }
      free(pointer);
      usedbystreams.clear();
    }

    И опять, ты вызвал s->killstream(0), привело ли это к удалению объекта на который указывает s?

    Вообще существуют инструменты для отладки работы с памятью, для gcc это прекрасный -fsanitize=address который покажет тебе при завершении программы, где была выделена утекшая память.
    Ответ написан
    Комментировать
  • По какой причине происходит дубляж реализации?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    webderiverxx все файлы .h, видимо реализация написана на .h файлах

    В .h файлах можно написать и так, что вот этого всего не будет. Если ты нам покажешь этот webdriverxx.h мы наверно сможем подсказать, что там нужно изменить для этого.

    есть лок в виде проверки препроцессора, почему неколько реализаций возникает, не совсем понятно

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В чем между ними разница и где какой предпочтительно использовать

    В том, что std::for_each -- это алгоритм из стандартной библиотеки C++, а tbb::parallel_for -- это часть intel Threading Building Blocks. Если проект не использует TBB, то выбор очевиден. Если использует, то у tbb::parallel_for несколько больше возможностей по управлению разбиением интервала на части и выполнением рабочих потоков.
    Ответ написан
  • Почему не компилируется макрос после перехода с visual studio на linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не компилируется
    НАЗВАНИЕ_КЛАССА ## ::
    error: pasting "Журнал" and "::" does not give a valid preprocessing token

    потому что не нужно эти токены склеивать, им будет хорошо и по отдельности. Просто выкинь ##.
    Ответ написан
  • Почему не компилируется макрос?

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

    #define НФлагИнициализации(НАЗВАНИЕ1, НАЗВАНИЕ2) \
        Определение2Названия(НАЗВАНИЕ1, НАЗВАНИЕ2) ## флаг_инициализации


    error: pasting ")" and "флаг_инициализации" does not give a valid preprocessing token

    потому что ты думаешь, что сначала выполнится подстановка макроса Определение2Названия, а потом к результату будет приклеен флаг_инициализации, в то время как на самом деле сначала препроцессор делает подстановку НАЗВАНИЕ1 и НАЗВАНИЕ2 и приклеивает флаг_инициализации к скобочке, после чего рапортует тебе о том, что полученный результат выглядит не очень.
    Чтобы заработало тебе прийдётся тащить ## флаг_инициализации внутрь Определение2Названия.
    Ответ написан
  • Как осуществить взаимодействие клиента и сервера на основе протокола TCP/IP?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если у тебя посреди функции main сервера действительно стоит return x | y;, то она не может никогда вызвать send, а программа-сервер должна просто завершаться после расчёта НОД.

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

    не знаю, как правильно найти НОД в данном случае:

    в данном случае x и y нужно извлечь из принятой из сокета строки, математика дальше в порядке, вместо return x | y нужно просто использовать x | y в itoa. Res и всё что с ним связано можно выкинуть, поскольку оно всё равно никак не используется.

    Но вообще, конечно, из кода видно, что твоя проблема не с НОД и не с сетевым программированием, а с тем, что С/С++ ты, судя по всему, просто не знаешь. Учи основы, не жди халявы.
    Ответ написан
    Комментировать
  • Самопроизвольное объявление define'ов в проекта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Получается, магическим образом, самопроизвольно, между включениями VulkanTexture.h и VulkanglTFModel.h был объявлен define.

    А на самом деле где этот define определяется и как это место относится ко всем этим заголовочным файлам?

    Разве препроцессор не последователен и может включать файлы в том порядке, в каком ему заблагорассудится, а не как я написал?

    Нет, не может, но возможно ты не вполне понимаешь сам, в каком порядке ты написал их подключение. Так, например, Helpers/VulkanTexture.h и VulkanTexture.h -- это один и тот же файл, или разные? Если один и тот же, то из-за #pragma once в нём он не подключается в VulkanglTFModel.h, а если разные -- то подключается.

    Понять, что фактичиски куда подключается можно выполнив вместо шага компиляции только препроцессирование (например, для gcc заменив в команде компиляции ключ -c на -E). В выводе препроцессора не видно дефайнов, но видно когда подключается тот или иной файл и видно весь исходный код не относящийся к препроцессору.
    Ответ написан
    Комментировать
  • Почему появляется такая ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что тут неправильно?

    для однозначного ответа на этот вопрос не хватает определения типа Student.
    Но судя по тому как всё падает, в Student есть не-POD поля, выделяющие и освобождающие память, например std::string или что-то типа того. Загружать их из файла просто читая записанное ранее содержимое памяти нельзя, потому что загруженные указатели будут ссылаться на невыделенную память, такие типы данных нужно по-честному сериализовывать.
    Ответ написан
    Комментировать
  • Почему при вызове return вызывается конструктор копирования, а не перегрузка оператора =?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    coffeeMachine mix = device + machine;
    вызывает перегрузку конструктора копирования, а не перегрузку оператор =, почему?

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

    А если написать вот так:
    coffeeMachine mix; mix = device + machine;
    то ты сначала создаёшь экземпляр со значением по умолчанию, а потом вызываешь оператор =.
    Ответ написан
    Комментировать
  • Как работает long long int в C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    где найти информацию о внутреннем устройстве long long int и unsigned long long int?

    В стандарте: eelis.net/c++draft/basic.fundamental

    у меня появилось впечатление, что long long int склеен из двух long int и дает псевдо длину в 64 бита. Поправьте меня, если я не прав

    Можно и так на это смотреть, но почему "псевдо"? Вполне реальные 64 бита, на машинах с 64-битными регистрами это вообще "родной" тип данных.
    Ответ написан
    3 комментария
  • Нужно найти сумму отрицательных чисел. Что с кодом?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    int sum;

    Переменная используется без инициализации.
    Замени int sum; на int sum = 0;
    Ответ написан
    1 комментарий
  • Почему программа загружается в разных областях памяти?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему программа каждый раз занимает различные области памяти?

    Потому что современные ОС делают это намеренно, чтобы затруднить эксплуатацию уязвимостей в ПО. Это называется ASLR: address space layout randomization. Обычно есть способ отключить ASLR глобально либо для отлаживаемых программ, чтобы добиться воспроизводимости результатов.
    Так, например, в linux это делается глобально с помощью файла /proc/sys/kernel/randomize_va_space либо командой setarch -R для одного конкретного процесса. Отладчик gdb по умолчанию отключает ASLR для отлаживаемых программ.
    Ответ написан
    3 комментария
  • Как задать выравнивание в массиве?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Могу ли я не используя vec4, задать выравнивание элементам массива?

    Не используя для элементов массива другой тип -- нет, не можешь. Не обязательно испольовать для этого vec4, можно завести какой-нибудь другой тип, породив его от vec3 и задав нужное выравнивание.
    Ответ написан
    Комментировать
  • Зачем нужен отдельный синтаксис для препроцессора?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Зачем нужен отдельный синтаксис для препроцессора

    Затем, что препроцессор -- это отдельная программа с отдельным языком? Внутри препроцессируемого файла может быть что угодно, не обязательно код на С или С++. Так, например, linux препроцессирует скрипты линковщика перед тем как использовать их. И исходники написанные на ассемблере, хотя у ассемблера есть собственные макросы, директивы для включения файлов и условной компиляции.
    Ответ написан
    4 комментария
  • Почему возникает ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему возникает ошибка?

    Потому что это не С++ код. Designated initializers есть в C начиная с C99 и в C++ есть начиная с C++20, но в С++ версии полно дополнительных ограничений.
    Ответ написан
    Комментировать