Задать вопрос
  • Как написать простой калькулятор?

    @res2001
    Developer, ex-admin
    Например:
    atoi(ex.c_str())+atoi(ex.c_str())
    это выражение 2 раза преобразует в число одну и ту же строку, а затем складывает эти 2 одинаковых числа.
    Так что "не дублирует", а выполняет то что написано у вас в коде.

    Вам нужно сначала разделить строку на "токены", т.е. на операнды и операции.
    Если вы на этом этапе расчитываете обрабатывать только простейшие действия, то вводите строку и разбиваете ее на 3 токена. Затем операнды преобразуете в числа и после этого уже выполняете действие.
    Ответ написан
    Комментировать
  • Книги по сетевому программированию на c++?

    @res2001
    Developer, ex-admin
    Не нужно зацикливаться на С++, т.к. все сетевое API операционной системы на Си. Изучайте просто сетевое программирование. Когда разберетесь, то просто возьмете сетевую библиотеку для плюсов и будете ее использовать. Как правило, подобные библиотеки просто оборачивают Си интерфейс ОС в классы.
    Так же рекомендую книгу Стивенса. Но она старая (последнее издание 2007 года) и в продаже вы ее сейчас не найдете. Электронная версия есть. Не смотря на возраст книга вполне актуальна. Подобные основополагающие технологии изменяются довольно не торопливо.
    Ответ написан
    Комментировать
  • Какая IDE удобнее и проще для плюсов?

    @res2001
    Developer, ex-admin
    qtcreator - хорош
    Eclipse - довольно тяжел для понимания, тормозит на больших файлах или когда открыто много файлов (Java дает о себе знать). Но если планируешь программировать для embeded, то полезно научиться с ним работать, т.к. многие IDE предоставляемые производителями железа основаны на Eclipse.
    С clion не приходилось сталкиваться.
    Ответ написан
    1 комментарий
  • Как с помощью for добиться такого же результата, что и командой dir?

    @res2001
    Developer, ex-admin
    Я бы предложил запихнуть dir в for /f и в for обрабатывать вывод dir, добавляя нужную информацию:
    for /f "tokens=* delims" %%a in ('dir /s /b *') in (
       rem Тут можно писать любой другой код. Имя текущего файла в %%a
       echo %%~a
    )
    Ответ написан
  • Что такое offset и как обратиться к информации что хранится в нём?

    @res2001
    Developer, ex-admin
    offset - смещение (от какого-то базового адреса).
    Т.е. адрес вашего объекта вычисляется так: base address + offset.
    Осталось узнать базовый адрес и можно работать с цветами.
    Ответ написан
    Комментировать
  • Член класса/структуры типа uint8_t * или int8_t *, оптимизация?

    @res2001
    Developer, ex-admin
    Если нет необходимости в подобной локальной переменной, то не нужно "кэшировать".
    На уровне ассемблера все обращения к памяти происходят через регистры, так что в любом случае адрес из указателя будет записан в регистр и этот регистр будет индексироваться.

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

    Часто удобно использовать локальную переменную, только потому, что указатель (ссылка) лежит где-то в третьей вложенности внутри класса - проще его сразу достать и дальше использовать короткую запись. Но это удобно программисту, а компилятору пофиг.

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

    С restrict можно поиграть, но в чистом С++ его нет, на сколько я знаю, но можно включить расширения в gcc/clang и, возможно его можно будет использовть в плюсовом коде. Но применяйте его лучше сразу к локальному bufferу, а не к this.

    Напоследок: подобного типа код выполняется достаточно быстро, оптимизировать тут особо нечего, есть смысл заморачиваться только если это очень-очень горячий код в вашем приложении. Ну и в плане оптимизации для подобных случаев лучше поискать варианты, как обойтись без копирования данных, чем надеятся, что restrict вам сильно поможет.
    Ответ написан
  • Выделение текста между двумя запятыми 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 /?
    Ответ написан
    Комментировать