Задать вопрос
Ответы пользователя по тегу C++
  • Как сделать сжатие и распаковку char* в C++ с помощью zlib?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что я делаю не так?

    Несколько вещей. В compress_char ты сначала выделяешь strlen(source) байт для вывода, а потом находишь compSize, который может быть и больше чем strlen(source). Ты не возвращаешь compSize после вызова compress, а он может измениться. Ты возвращаешь только char*, как будто это строка, но это не строка, там могут быть нулевые байты.
    В uncompress_char почти те же самые ошибки. Плюс какая-то путаница между length, compSize и ucompSize. На вход uncompress в параметре compSize должен попасть настоящий размер сжатых данных, а не догадка о нём на основе вызова compressBound.
    Я бы поменял код как-то так:
    char* compress_char(const char* source, size_t *outCompSize, size_t *outUcompSize)
    {
        uLong ucompSize = strlen(source) + 1;
        uLong compSize = compressBound(ucompSize);
        char* bytes = malloc(compSize);
        compress((Bytef *)bytes, &compSize, (Bytef *)source, ucompSize);
        *outCompSize = compSize;
        *outUcompSize = ucompSize;
        return bytes;
    }
    
    char* uncompress_char(const unsigned char source[], size_t inCompSize, size_t inUcompSize)
    {
        uLong ucompSize = inUcompSize;
        uLong compSize = inCompSize;
        char* message = malloc(ucompSize);
        uncompress((Bytef *)message, &ucompSize, (Bytef *)source, compSize);
        return message;
    }
    
    void foo(void)
    {
        size_t a, b;
        char *p = compress_char("{\"a2\":\"b\"}", &a, &b);
        char *p1 = uncompress_char(p, a, b);
        printf("%s, %zd -> %zd\n", p1, b, a);
    }


    Плюс ты не обрабатываешь коды возврата из compress/uncompress.
    Ответ написан
    Комментировать
  • Статическое подключение zlib в .so?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У меня есть код на C++, который использует zlib. Я хочу на линуксе его скомпилировать в .so библиотеку, но чтобы команда ldd не показывала libz.so или libz.so.1 (чтобы zlib был встроен в .so).

    Ключами линковщика -Bstatic и -Bdynamic можно переключать режим линковки библиотек:
    g++ -shared foo.cc -o libfoo.so -Wl,-Bstatic -lz -Wl,-Bdynamic

    Но если так сделать, то можно заметить, что не всякую статическую библиотеку можно прилинковать к .so, а только такую, объектники которой собраны с флагом -fpic.
    Ответ написан
  • Почему substr работает странно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Последняя кавычка ни в какую не хочет убираться, не могу понять, в чем дело
    std::string variable_value = var.substr(variable_value_start + 1, variable_value_end - 1);

    Второй параметр std::string::substr -- это длина выделяемой подстроки, а не индекс конца.
    Должно быть
    std::string variable_value = var.substr(variable_value_start + 1,
                                            variable_value_end - variable_value_start - 1);
    Ответ написан
  • Что не так с кодом на C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    for (int i = 0; i<2; i++){
        group.PutCar(i,Car(marks[i],powers[i],costs[i],displaces[i]));
      }

    -- заполняет элементы группы 0 и 1
    group[2].Print();

    -- пытается напечатать элемент группы 2, не заполненный. Думаю, что дело в этом.

    Ещё пара глюков:
    void Group::Print(){
      for (int i = 0; i<sizeof(array); i++){
        array[i].Print();
      }
    };

    sizeof работает не так и тут делает не то, что вы ожидаете. Для количества элементов в группе используйте имеющийся в классе Group size.

    operator double (){
        int summ = 0;
        for(int i = 0; i < sizeof(array); i++){
        summ += array[i].getCost();
        }

    то же самое здесь.

    Традиционно добавлю, что правильным было бы использование std::string (в Car) и std::vector (в Group), но подозреваю, что это это было такое задание.
    Ответ написан
    Комментировать
  • Можно ли записать структуру в файл используя basic_ofstream?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можно ли записать структуру в файл используя basic_ofstream?

    Можно, но для этого не нужно делать её тип аргументом шаблона basic_ofstream.
    Ответ написан
  • Почему переопределение метода без virtual -- это не переопределение?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если в официальной доке с++ где-то написано "переопределение возможно тогда и только тогда, когда есть virtual у метода базового класса"

    Написано, ровно это: eelis.net/c++draft/class.virtual#2

    то почему именно так?

    Потому что это определение термина function override в C++. Для других вариантов взаимодействия имён функций есть другие термины.
    Ответ написан
    Комментировать
  • Почему возникает ошибка при компилации gtest?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    не могу понять в чем проблема
    ошибка: undefined reference to `CheckUP::checkUP(std::__cxx11::basic_string, std::allocator >&, float&)'

    Проблема в том, что ты не слинковал свой тест с кодом реализующим класс CheckUP.
    Ответ написан
  • Что не так с функцией на C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    error C2835: user-defined conversion 'operator`double'' takes no formal parameters

    Он говорит тебе о том, что такая перегрузка: operator double (int limit) невозможна. Вторая ошибка -- это следствие первой.

    Определим в объекте Group две функции с одинаковым именем, например double Age(); и double Age(int limit);.

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    должна возникнуть ошибка, но по факту её не возникает.

    А ты собери свою программу с санитайзером памяти (-fsanitize=address) и будет тебе ошибка.
    Обращение к памяти за пределами выделенных массивов -- это UB, отсутствие видимого эффекта -- допустимый вариант поведения при UB.
    Ответ написан
    Комментировать
  • Как исправить ошибку "invalid use of incomplete type"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как правильно выстроить определения данных классов, что бы программа компилировалась?

    Перенести определения классов A и S после определения класса M, добавить объявление класса S перед определением класса D.
    Ответ написан
  • Почему в С++ появляется Segmentation fault?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    конкретную причину ошибки в коде так и не уставновил

    Да вот же она: Tree* head{0}; -- в head у тебя NULL.
    А std::cin >> head->sizeOfChild пытается читать в поле объекта на который указывает head.
    Ответ написан
    Комментировать
  • Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Никак не пойму что за ошибка, и что она хочет от меня.

    Ошибка -- обращение к памяти, к которой нельзя обращаться, первая ссылка по запросу sigsegv в гугле.
    Хочет она от тебя чтобы ты веделил память для colonies[i].aparts перед тем как к ним обращаться.
    Ответ написан
    Комментировать
  • Как исправить проблему с неоднозначностью?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    void EcsSystems::Add(IEcsSystem* system) {
      _systems.push_back(system);
    
      if (IRunSystem* runSystem = static_cast<IRunSystem*>(system)) {
        _runSystems.push_back(runSystem);
      }
    }

    Это странное решение -- сначала потерять всю информацию о типе, а потом м помощью каста выяснять, а каким же он был. К тому же здесь очевидно имелся в виду dynamic_cast, потому что результат static_cast для не-NULL аргумента всегда будет отличным от NULL.
    Ответ написан
    Комментировать
  • Откуда здесь NAN?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Помогите, пожалуйста

    Если MultiplyMatrices переписать как три обычных вложенных цикла, всё работает нормально.

    float* vMultiplyMatrices(const float* matrix_1, const float* matrix_2)
    {
            __m128 vector_2;//переменная для хранения значения второй матрицы
            __m128 result_vector;//переменная для записи итоговой марицы
            auto* result_matrix = (float*)_mm_malloc(N * N * sizeof(float), 16);//выделение памяти с выравниванием
    (2)     //memset(result_matrix, 0, N * N * sizeof(float));
            for (int i = 0; i < N; ++i) {
                    for (int j = 0; j < N; ++j) {
                            __m128 element_vector = _mm_set1_ps(matrix_1[i * N + j]);//4 позиции в одно значение
                            for (int k = 0; k < N; k += 4) {
                                    vector_2 = _mm_load_ps(&matrix_2[j * N + k]);//4 значение по адресу
    (1)                             result_vector = _mm_load_ps(&result_matrix[i * N + k]);
                                    result_vector = _mm_add_ps(result_vector, _mm_mul_ps(element_vector, vector_2));
                                    _mm_store_ps(&result_matrix[i * N + k], result_vector);
                            }
                    }
            }
            return result_matrix;
    }


    В отмеченной (1) строке ты загружаешь в result_vector неинициализированные значения из result_matrix и дальше используешь их в арифметике. Если раскомментировать memset (2), то выполнение доходит до конца без nan.
    Короче, разбирайся со своими векторными оптимизациями.
    Ответ написан
    Комментировать
  • Почему при использовании переменной в методе, выдает ошибку Linker Tools Error LNK2001?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему при использовании переменной в методе, выдает ошибку
    class Test
    {
      static std::string question;


    Потому что статическое поле класса нужно определить, его упоминание в определении класса -- это не определение. Определить его можно например так в .cpp вне всех функций:
    std::string Test::question;
    Ответ написан
    Комментировать
  • Почему при объявлении итератора выдается ошибка?

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