• Выделение текста между двумя запятыми C++?

    @res2001
    Developer, ex-admin
    Потому что второй параметр в substr - это не конечная позиция, а количество символов. Ощути разницу.
    Ответ написан
    Комментировать
  • Почему мой вектор не работает со строками?

    @res2001
    Developer, ex-admin
    С clon все в принципе нормально. Можно конечно добавить std::move, но проблема не в этом.
    Проблема в том, что у тебя массив arr размером length - 1, а temp - length. А в clon() ты пытаешься копировать length элементов из arr, поэтому происходит выход за пределы массива.
    В PushBack делай инкремент length, только после того как вызовешь clon первый раз, но до второго вызова.

    Жаль немецкий убрал, было забавно :-) Но так гораздо привычней и понятней.
    Ответ написан
    Комментировать
  • Почему определение инкапсуляции дают неправильно?

    @res2001
    Developer, ex-admin
    Фиг знает, может из википедии?
    Модификаторы доступа надо было куда-то включить, вот и запихнули их в инкапсуляцию. Не в наследование же и полиморфизм их пихать.
    Ответ написан
    Комментировать
  • Как через cmd и терминал удалить из папки все файлы, кроме выбранных?

    @res2001
    Developer, ex-admin
    Набросаю схематично вариант без forfiles.
    Имеем текстовый файл file.txt со списком имен файлов, которые не надо удалять - одно имя файла на каждой строке.
    Получить список всех файлов в каталоге можно с помощью dir /b
    Далее этот список отфильтровать, исключая файлы, содержащиеся в file.txt, примерно так:
    dir /b c:\test\* | findstr /v /g:file.txt
    На выходе по идее должен быть список файлов, которые надо удалить.
    Эту команду запихнуть в
    for /f "tokens=* delims=" %%a in ('dir ... ^| findstr ...') do (del %%a)

    В принципе все.
    Проверить все сейчас не могу, т.к. под рукой нет винды, поэтому только общая идея, компоновать придется самому.
    За подробностями:
    dir /?
    for /?
    findstr /?
    del /?

    Рекомендую сначала выполнить связку dir | findstr вручную в консоли и добиться, что бы выдавался нужный результат (список файлов для удаления), только затем все это оформлять в батник.
    Ответ написан
  • Как выделить подстроку с числом с фиксированной точкой?

    @res2001
    Developer, ex-admin
    В string то же можно обращаться к отдельно взятому символу с помощью оператра индексации.

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

    @res2001
    Developer, ex-admin
    Целую часть можно получить с помощью floor(v)
    Дробную: (v - floor(v))
    Для сортировки используйте стандартный sort.

    Кстати, отсортировать вы можете массив (он у вас уже есть в памяти), когда говорят про поток, то это нечто потенциально бесконечное, порции данных из потока вы получаете частями и обрабатываете их.
    Соответственно, если у вас действительно поток, то надо строить из его данных дерево. Для этого можно использовать стандартный map. Данные будут укладываться в дерево по мере поступления с одновременной сортировкой. Получить из дерева отсортированный список можно просто обходом дерева с помощью итератора.
    Данные в дереве сортируются по ключу. Для ключа можно использовать примерно такую конструкцию: floor(v) + (1 - (v - floor(v)))
    Ответ написан
    3 комментария
  • Как инвентаризировать пк без установки доп по на пк?

    @res2001
    Developer, ex-admin
    Подозреваю, что сеть на винде.
    Вообще большую часть информации по установленному программному обсепечению и железу можно найти в реестре винды. С реестром можно работать удаленно, имея доменные админские права.
    Так же можно получить много информации по WMI, с помощью wmic в cmd или в powershell.
    Из инвентаризационного ПО, которое использует подобный сбор информации знаю о "10Strike: Инвентаризация".
    В свое время использовал это ПО - стоит не дорого, обновления бесплатные (когда я использовал это ПО), поддержка адекватная.
    Ответ написан
    Комментировать
  • Правильно ли я понимаю работу программы?

    @res2001
    Developer, ex-admin
    Правильно понимаете.

    Цикл for (int i = count-1; i < count; i++) всегда из одной итерации, так что смысла в нем нет. Оставьте просто одно выделение памяти для последнего элемента массива А (сам цикл уберите).
    В конце вы не освобождаете память - это утечка. В реальных проектах подобное поведение плохо заканчивается.
    Ответ написан
    1 комментарий
  • Как сортировать данные структуры по дате, если дата задаётся символьной строкой?

    @res2001
    Developer, ex-admin
    1. Строки сравниваются с помощью strcmp. Когда вы сравниваете так как у вас в коде, то вы сравниваете значения указателей, а не то на что указывают эти указатели.
    2. Чтобы сравнить числа в строковом представлении, строки должны быть одинаковой длинны, т.е. число в строковом представлении с меньшим количеством знаков должно быть дополнено слева нулями до длины большего числа (или дополнять оба числа до какой-то фиксированной длины).
    3. Когда у вас "склеено" несколько чисел в строку (каждое из чисел дополнено нулями), то порядок склейки для сортировки должен быть от большей сущности к меньшей. В вашем примере в начале строки должен идти месяц, а затем день.
    Только применив все три пункта вы сможете правильно отсортировать подобные строки.
    Все это кратко изложил jcmvbkbc в своем ответе.

    Но! Вам ничего не мешает сразу же при вводе преобразовывать дату в числовое представление и сортировать уже числа. Это будет гораздо быстрее, чем решать проблемы с текстовой сортировкой.
    Ответ написан
  • Как отправлять AT команды из командной строки и получать ответ?

    @res2001
    Developer, ex-admin
    Ответ написан
    Комментировать
  • Задача на строки в Си: как конкатенировать строки без библиотечных функций(старый вопрос удален)?

    @res2001
    Developer, ex-admin
    Как можно было сделать то же самое, но при помощи традиционной обработки массива?

    А что такого по вашей ссылке не традиционного в смысле обработки массива? Там вполне традиционные операции.
    Видимо вы привыкли, что обращение к элементам массива это arr[i]. Но это лишь один из вариантов.
    Вариант примененный в коде по ссылке - инкремент указателей - просто смещает указатель на следующий элемент массива. По идее это должно работать немного быстрее, чем arr[i].
    Кстати, принцип работы итераторов в C++ std как раз тот же самый, что использован тут. Так что можете считать, что dest и src это итераторы по строке :-)

    Если очень хочется, то можете переписать код с применением индексации. Ничего сложного в таком преобразовании кода нет.

    По ссылке, реализован аналог strcat, но эта функция (так же как и функция по ссылке) может приводить к выходам за пределы массива, т.к. тут вообще ни как не контролируется размеры массивов. Было бы интересно реализовать аналоги strncat или strncat_s.
    Ответ написан
    Комментировать
  • Что означает память с явными адресами?

    @res2001
    Developer, ex-admin
    Отображение - видимо применение функции типа mmap (линукс), в винде то же есть аналог.
    Явные адреса - имеется ввиду указание адреса в виде константы в коде. Такое применяется обычно для работы с железом. В прикладном софте в этом нет необходимости.
    Еще явные адреса могут указывать, когда пытаются что-то изменить в другом процессе. Например накрутить счетчик денег в игре :)
    Ответ написан
    Комментировать
  • Как удалить массово папки весом меньше 1mb?

    @res2001
    Developer, ex-admin
    Основная проблема - быстро узанать размер каталога. Стандартных средств cmd для этого нет.
    Остается только делать рекурсивный обход каждого каталога и суммировать размеры каждого файла, как только сумарный размер превысит 1 Мб подсчет можно прекращать и пропускать каталог.
    Размер конкретного файла можно получить из переменной цикла for /f с помощью модификатора %%~zi. Этот же модификатор действует и для нумерованных параметров процедур
    Смотрите:
    for /?
    call /?
    set /?
    rmdir /?
    Ответ написан
    Комментировать
  • Почему такая низкая скорость с openvpn?

    @res2001
    Developer, ex-admin
    РКН начинает блокировать openvpn?

    Если бы начал, то скорость бы упала в ноль.

    Для начала стоит замерить задержки на пути пакетов от дома до ВПН сервера. Это надо сделать когда скорость нормальная и когда скорость упала. Проводите замеры несколько дней, чтоб набрать статистику. Сравнивая задержки, вы сможете найти на каком участке по пути есть провалы скорости. Возможно, во время провала скорости меняется маршрут пакетов и т.п.
    Измеряйте задержки не внутри ВПН, а по "чистому" каналу. Измерять задержки можно с помощью traceroute (tracert) или с помощью iperf.

    Если провалы скорости у ваших операторов (Мегафон или Contabo), то можно попробовать пообщаться с поддержкой операторов. Если же это где-то по середине, у других операторов, то вряд ли можно что-то реально сделать. Вероятно только сменить своего оператора, или попробовать как-то повоздействовать через своего оператора, предоставив ему статистику.
    Ответ написан
    Комментировать
  • Как сделать сортировку Шелла на Си?

    @res2001
    Developer, ex-admin
    Возвращайте значение iterations из shellsort. В main суммируйте эти значения и в конце находите среднее.
    Ответ написан
    Комментировать
  • Как сымитировать потерю пакетов?

    @res2001
    Developer, ex-admin
    Например во FreeBSD в штатном фаерволе ipfw есть такая штука как dummynet - специально для целей тестирования. Там можно настройками задавать скорость и процент потерь. Можно очень хорошо отлаживать сетевые приложения, если сделать фряху с подобным фаерволом шлюзом между клиентом и сервером вашего приложения. Подобную сетку запросто можно поднять на виртуалках.
    Ответ написан
    Комментировать
  • Почему вылезает сообщение "make: «build» не требует обновления"?

    @res2001
    Developer, ex-admin
    Ответ в комментариях
    Ответ написан
    Комментировать
  • Как передать массив в функцию С++ ( пишет no matching function to call)?

    @res2001
    Developer, ex-admin
    Написал опус на вопрос, который вы удалили, хорошо сохранился в буфере обмена :-) а то было бы обидно.

    Ваш массив пожно просто привести к указателю, по старинке (int*)a или используя касты.

    Но у вас тут на самом деле 2 проблемы.
    Первая - обращение к элементам массива в average используя [i][j]. Вторая - VLA.
    По первой проблеме:
    В С/С++ оператор индексации (array[i]) выполняет следующее действие: *(array+i).
    Отсюда должно быть понятно, что раз array у вас это int*, то после array[i] вы получите int, от которого уже нельзя взять второй индекс, т.к. это просто 1 int, а не массив.

    Отсюда есть несколько выходов:
    1. дурацкий (самый долгий по исполнению и затратам памяти): использовать динамический массив массивов
    Выглядит примерно так:
    int **array = new int*[rowCount];
    for(int i=0; i < rowCount; ++i)
       array[i] = new int[colCount];

    Как видите array превратился в двойной указатель, теперь каждый элемент в первом измерении - это указатель на одномерный массив. Всего у вас получается rowCount + 1 выделений памяти. Не забудьте столько же раз вызвать оператор delete.
    В average теперь передавайте int** и у вас будет работать оператор [][], т.к. первая индексация уже будет возвращать int*.
    Не рекомендую использовать этотт способ.

    2. Вычислять индекс массива вручную (не использовать индексацию):
    *(array + i*colCount + j)
    Это такой хардкорный стиль. Но зато работает быстро и масштабируется на массивы любой размерности без особых проблем.

    3. использовать std::vector<std::vector<int>> - это то же самое, что и вариант 1, но закамуфлированный под вектор :-)

    Вторая проблема это VLA (Variable Length Array).
    Статические (автоматические) массивы в С++ вы можете определять, только константным размером (размером известным на этапе компиляции).
    У вас же размерность массива динамическая (вводится пользователем во время выполнения программы). Отсюда следует, что вы должны использовать динамические массивы, выделенные с помощью new.
    В стандарте С++ нет VLA. VLA есть только в Си и то начиная с С99.
    Ваша функция task3 компилируется, только потому что в gcc/clang по умолчанию включены расширения. В расширения входит так же и возможность использовать VLA. Если задать опциями более строгое соответствие стандарту С++, то функция не соберется.
    И кстати, например в микросовтовский компилятор VLA до сих пор не завезли.

    Но если уж у вас есть VLA, то вы можете преобразовывать указатель в VLA массив с помощью такой кучерявой конструкции:
    int (*array2)[colCount] = (int(*)[colCount]) array;

    В этом случае обращаться к элементам массива можно как обычно через двойную индексацию: array2[i][j]
    Когда-то делал тест на эту тему: https://ideone.com/4i6lRw
    Кстати, если в average сначала передать размерности, и последним параметром массив, то по идее массив можно сразу объявить двумерным, используя ранее переданные размерности:
    void average(int rowcount, int colcount, int aarray[rowCount][colCount])

    Это то же VLA.

    Вообще не рекомендую в С++ использовать VLA, т.к. программа становится не переносимой и зависимой от компилятора.
    Ответ написан
    4 комментария
  • Как скопировать файлы по дате изменения посредством bat?

    @res2001
    Developer, ex-admin
    Развернуто не выйдет - нет под рукой винды. Могу дать направление.

    Получить отсортированный по дате изменения список файлов можно с помощью команды: dir /b /a-d /od *
    За сортировку отвечает ключ /od, можно получить обратную сортировку, тогда надо задать ключ /o-d. Ключ /a-d удаляет из вывода каталоги (по умолчанию dir выводит и каталоги то же).
    Эту команду надо запихнуть в цикл, примерно так:
    for /f "tokens=* delims=" %%a in ('dir /od ...') do (
      echo %%a
    <тут команды тела цикла>
    )

    В цикле просто на первой итерации копируете файл в to и to2 и выходите из цикла (goto).
    Для дальнейших действий аналогичные циклы по соответствующим каталогам, только пропускаете первых 5 итераций, на остальных файлы удаляете. Пропустить 5 итераций в цикле можно либо счетчиком в теле цикла, либо есть опция цикла skip.
    Примерно схема уже должна быть ясна.
    Отработайте этапы команды по одному, а потом запихните все этапы в один батник.
    Детали применения команд смотри:
    dir /?
    for /?
    set /?
    goto /?
    Ответ написан
    6 комментариев