• Почему появляется такая ошибка?

    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;
    то ты сначала создаёшь экземпляр со значением по умолчанию, а потом вызываешь оператор =.
    Ответ написан
    Комментировать
  • Почему не считывает русскую букву в char?

    mayton2019
    @mayton2019
    Bigdata Engineer
    При работе с языками в консоли обычно возникают следующие вопросы.
    1) Консоль. Какая кодировка по умолчанию для однобайтных символов. Смотри команду.
    chcp для windows или
    $ locale для linux.
    2) Какая кодировка указана для char для текущего компиллятора. Включен ли режим _UNICIDE.
    Посмотри что делают
    setLocale(...);
     setCodepage(...);

    3) Какой размер символа sizeof(char).
    4) В какой кодировке написан исходник. Это можно проверить если посмотреть hex редактором. Там где русская буква может быть например 0xC0 для однобайтной и двух байтной для Unicode.
    5) Установлены ли шрифты? Операционка может быть англо-язычной и в этом случае она не обязата что-то специфичное отображать.
    Ответ написан
    Комментировать
  • Как создать диапазон чисел в массиве от -0.1 к 0.2,используя float и после ShellSort?

    sheerluck
    @sheerluck
    #include <random>
    #include <iostream>
    
    int main()
    {
        auto n = 9;
        auto rnd = std::random_device{};
        auto gen = std::mt19937_64{rnd()};
        auto dis = std::uniform_real_distribution<double>{-0.1, 0.2};
        auto res = std::vector<double>{};
        std::generate_n(
            std::inserter(res, std::end(res)),
            n,
            [&](){ return dis(gen); }); 
    
        for (const auto& elem: res)
        {
            std::cout << elem << '\n';
        }
    }
    Ответ написан
    Комментировать
  • Как преобразовать строку в многоуровневый путь?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const propByPath = (object, path) => path.split('.').reduce((acc, cur) => acc?.[cur], object);
    Ответ написан
    1 комментарий
  • Для чего нужна двойная ссылка &&?

    Это называется rvalue reference
    Ответ написан
    Комментировать
  • Как ускорить алгоритм скользящего среднего?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const movingAverage = (data, windowSize) => {
      let sum = data.slice(0, windowSize).reduce((acc, cur) => acc + cur, 0);
      const result = [sum / windowSize];
      for (let i = windowSize; i < data.length; i += 1) {
        sum = sum - data[i - windowSize] + data[i];
        result.push(sum / windowSize);
      }
      return result;
    };
    console.log(movingAverage([9, 3, 2, 0, 1, 5, 1, 0, 0], 3));
    // Array(7) [ 4.666666666666667, 1.6666666666666667, 1, 2, 2.3333333333333335, 2, 0.3333333333333333 ]
    Ответ написан
    2 комментария
  • Как происходит доступ к эл. массива на уровне ядра? Malloc выделяет непрерывную физическую память?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как происходит доступ к эл. массива на уровне ядра?

    Так же как и на уровне приложения -- через трансляцию виртуального адреса в физический.

    Например массив Int* arr = new int[1024*1024*1024] он как храниться?

    Если мы для определённости возьмём linux, то у ядра есть несколько разных способов выделения памяти, в зависимости от того, для чего эта память выделяется. Есть наиболее простой и стандартный kmalloc который выделяет память непрерывную как виртуально так и физически. Обычно этим механизмом нельзя выделить большой непрерывный кусок. Есть vmalloc, который выделяет непрерывную виртуально, но возможно прерывную физически память. Есть get_free_pages который выделяет непрерывные страницы физической памяти, возможно, не отображаемые ни в какие виртуальные адреса. Есть Contiguous Memory Allocator который при старте системы резервирует кусок непрерывной физической памяти и может аллоцировать оттуда куски по запросу.
    Важный момент состоит в том, что аллокации делаемые ядром linux через упомянутые интерфейсы всегда обеспечиваются физической памятью, у памяти ядра нет пейджинга.

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

    Почему быстрее? С точки зрения процессора всё равно будет трансляция виртуального адреса в физический, если повезёт -- попадание в TLB, если не повезёт -- ходить по каталогам и таблицам страниц в памяти.

    получается эмулятор каждый адрес вычислять что ли?

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

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Раз Unit - интерфейс, то заведи метод OnPlace, но у базового класса Unit он просто будет пустым. Т.е. вызывай его всегда. А конкретный Unit реализует то, что ему надо.
    Дженерик тут вообще не нужен. Просто внутри метода Unit проверяй, какой объект вызывал метод

    Пример на Delphi
    type
      IUnit = interface;
    
      ILane = interface
        ['{494F502B-7659-4C5F-B72A-B6BFBF67F9B7}']
        procedure Place(Item: IUnit);
      end;
    
      IGroundLane = interface(ILane)
        ['{02D598FF-2AA9-4752-B808-44F8FE909B7B}']
      end;
    
      IUnit = interface
        ['{4EB084E7-9F79-40B6-92C0-A1A8C794F025}']
        procedure OnPlace(Sender: ILane);
      end;
    
      TUnit = class(TInterfacedObject, IUnit)
        procedure OnPlace(Sender: ILane); virtual;
      end;
    
      TMyUnit = class(TUnit)
        procedure OnPlace(Sender: ILane); override;
      end;
    
      TLane = class(TInterfacedObject, ILane)
        procedure Place(Item: IUnit);
      end;
    
    impl
    
    { TUnit }
    
    procedure TUnit.OnPlace(Sender: ILane);
    begin
      // do nothing
    end;
    
    { TLane }
    
    procedure TLane.Place(Item: IUnit);
    begin
      //add item
      Item.OnPlace(Self);
    end;
    
    { TMyUnit }
    
    procedure TMyUnit.OnPlace(Sender: ILane);
    var
      Lane: IGroundLane;
    begin
      if Supports(Sender, IGroundLane, Lane) then
        // it's IGroundLane
    end;
    Ответ написан
    Комментировать
  • Как повернуть квадратную матрицу?

    0xD34F
    @0xD34F
    class Solution:
      def rotate(self, matrix: List[List[int]]) -> None:
        length = len(matrix)
        for i in range(0, length // 2):
          for j in range(i, length - i - 1):
            matrix[i][j], \
            matrix[j][length - i - 1], \
            matrix[length - i - 1][length - j - 1], \
            matrix[length - j - 1][i] \
            = \
            matrix[length - j - 1][i], \
            matrix[i][j], \
            matrix[j][length - i - 1], \
            matrix[length - i - 1][length - j - 1]
    Ответ написан
    1 комментарий
  • Достаточно ли будет чтения cppreference для освоения STL?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Не слишком понятно, что имеется ввиду под "освоением STL". Это всего лишь библиотека языка. Вам надо знать, грубо говоря, что в ней есть в плане возможностей. А уж потом, по мере необходимости, идти и читать документацию.

    Проще говоря, допустим случай, когда вам надо отсортировать массив. Зная, что в STL есть и класс для массива и методы сортировки, вы идёте и читаете документацию, а потом используете. cppreference -- отличный ресурс с примерами.

    Я помню читал одну относительно тоненькую книгу по STL когда-то. Вроде бы неплохая была. Сейчас уже наверно устарела: "STL tutorial and reference guide" by David R. Musser .
    Ответ написан
    Комментировать
  • Конструктор не создает переменную внутри класса. что делать?

    GavriKos
    @GavriKos
    Пространство видимости. Ващ massive объявлен в конструкторе, а не в классе. Поэтому в function он не доступен.
    Ответ написан
    5 комментариев
  • Почему программа требует константу?

    @res2001
    Developer, ex-admin
    Наверное стоит обратится к учебнику по Си почему именно так.
    Изначально автоматические массивы в Си имели фиксированный размер, т.е. размер надо задавать константой.
    Отличие константы от обычной переменной - компилятор в процессе компиляции знает значение константы, а значение переменной нет. В процессе компиляции компилятор может сгенерировать команды для выделения памяти под массив.

    Начиная с С99 (это такой стандарт Си от 1999 года) появились VLA (Variable Length Array). Синтаксис такой же как и у обычных массивов, но они могут иметь изменяемый размер, т.е. размер можно задавать обычной переменной.
    Использование VLA влечет дополнительные расходы времени выполнения, поэтому многие принципиально не используют эту возможность (например ядро Linux). И это вполне оправданно еще и потому, что память под VLA массивы выделяется на стеке, пространство стека ограничено, а вы с дуру можете там выделить слишком большой массив, что вызовет переполнение стека.

    Большинство компиляторов поддерживают VLA, но судя по ошибке, вы используете микрософтовский компилятор. Микрософт никогда не славилась поддержкой стандартов Си. VLA в ее компилятор не завезли до сих пор.
    Ответ написан
    Комментировать
  • Почему программа требует константу?

    MvcBox
    @MvcBox
    Software Engineer [C/C++/JS(for Node.js)/etc]
    Потому, что массив "block" живет на стеке и компилятору надо знать его размер еще на этапе компиляции, чтобы правильно посчитать смещения. Если на этапе компиляции Вы не знаете сколько вам может потребоваться памяти, используйте malloc() для ее выделения в куче.
    Ответ написан
    2 комментария
  • Какой подход использовать в многопоточном программировании на Си?

    includedlibrary
    @includedlibrary
    Можно. Макросы генерируют код, после чего он компилируется. Проблемы с многопоточностью могут возникнуть только в случае, если вы сделаете макрос, который генерирует не потокобезопасный код
    Ответ написан
    2 комментария
  • Как построчно сравнить два файла txt?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Первое. Тема топика Python + PowerShell. Тоесть непонятно тебе нужно программировать и развивать этот софт или решить задачу 1 раз и забыть. В зависимости от желания - будет разная реализация.

    Второе. Есть коробочные утилиты fc (Windows) diff (Linux) которые такое сравнение делают. Но обычно для исходников и при условии что изменений мало. Почитай про них. Возможно это частично решит твою задачу.

    Третье. Ты хочешь сравнивать одну строку со всеми из другого файла. Это декартово произведение. В данном случае тебе можно сортировать оба файла и тогда одинаковые значения будут кластеризованы рядом. Sort + Diff решают твою беду.

    Вобщем думай. Но лучше 1 раз сделай покрывающий пример двух файлов. И результат чего надо на выходе. Это сэкономит время.
    Ответ написан
    1 комментарий
  • Существует ли формула позволяющая определить какое из двух чисел является самым большим?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Максимум:

    ( a + b + sqrt(  ( a - b ) * ( a - b ) ) ) 
    ___________________________________________
                         2


    Чтобы получить минимум, надо перевернуть знак перед корнем:

    ( a + b - sqrt(  ( a - b ) * ( a - b ) ) ) 
    ___________________________________________
                         2


    Где SQRT - взятие корня квадратного

    Код на плюсиках:
    int32_t TheMadMax( const int32_t a, const int32_t b ) 
    {
        const int32_t alpha = ( a - b );
        const int32_t beta  = alpha >> 31;
        const int32_t gamma = ( alpha ^ beta ) - beta;
        return ( a + b + gamma ) >> 1;
    }


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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    все это не подходит, так как мне нужно чтобы полученное число c лежало в промежутке [0; 11]


    Ну так a * (max(b) + 1) + b же.
    Иными словами мы делаем двузначное число в позиционной системе исчисления с неравными весами разрядов, младший разряд -- b, старший разряд -- a. Вес младшего разряда -- 1, вес старшего -- max(b) + 1.
    Ответ написан
    6 комментариев
  • Как хранить и сравнивать локации?

    Во многих СУБД есть расширения для работы с пространственными и гео-данными.
    Например в postgres - PostGIS.
    Тебе нужно просто для каждого пользователя определить геолокацию как широту-долготу, а поиск в определённом радиусе уже будет реализован в postgis.

    Это будет сильно быстрее чем "сравнить всех со всеми" благодаря специальным индексам
    Ответ написан
    Комментировать