Задать вопрос
  • Отличие терминов Инварианта и Свойства?

    @res2001
    Developer, ex-admin
    Из википедии:
    Инвариант в объектно-ориентированном программировании — выражение, определяющее непротиворечивое внутреннее состояние объекта.

    Но это относится не только к ООП, а в принципе.
    Из ваших примеров, по моему, только 4 про инвариант.

    Исходя из определения из вики, инвариант - логическое выражение (а не свойство), которое всегда должно выполняться для объекта. Если оно не выполняется, то объект (класс, структура и т.п.) находится в несогласованном состоянии и его дальнейшее использование опасно.
    Обычно инварианты нарушаются внутри методов класса, при выходе из метода инвариант должен снова восстанавливаться, иначе метод отработал не правильно.
    Простой пример: для Си строки инвариант - не нулевой указатель на начало и символ 0 в конце строки.
    Например у вас есть функция AddString, которая добавляет к существующей строке другую строку. Для простоты предположим, что не нужно перевыделять память. В процессе выполнения AddString инвариант нарушается - 0 символ заменяется добавляемыми символами второй строки. Но после добавления нулевой символ должен быть восстановлен в конце, после чего инвариант снова будет истинным.

    Для одного объекта может быть несколько инвариантов, для разных методов объекта могут быть важны не все инварианты. Если метод в ходе своей работы нарушает какой-то инвариант, есть смысл в начале и конце метода проверить этот инвариант с помощью assertа. Это предотвратит возможные ошибки.
    Ответ написан
    2 комментария
  • Как создать текстовый документ с кодировкой ANSI?

    @res2001
    Developer, ex-admin
    Простой текстовый документ (не Unicode).
    Под ANSI обычно понимают первые 128 символов ASCII, которые общие для большинства используемых однобайтовых кодировок.
    Т.е. тупо пишете в текстовый документ английские буквы, цифры и кое-какие дополнительные знаки с кодом <128 и будет вам ANSI.
    Ответ написан
  • Как завершить все процессы svchost, кроме системных?

    @res2001
    Developer, ex-admin
    Думаю что одной командой тут не обойтись.
    Можно получить список запущенных svchost с PIDами и путем, затем отфильтровать его, убрав те, которые лежат в %SystemRoot%\System32. После этого уже можно прибивать оставшиеся в списке процессы по PIDу из списка.
    tasklist полный путь не выводит. Полный путь можно получить с помощью:
    wmic process where "name='svchost.exe'" get Name,ProcessID,ExecutablePath

    Правда для большей части запущенных у меня svchostов эта команда так же не дает полный путь в ExecutablePath (Win10 x64), предполагаю, что это какие-то вторичные порожденные процессы.
    Ответ написан
    Комментировать
  • Как передать массив списков в функцию Си (С++)?

    @res2001
    Developer, ex-admin
    int searchByHash(Stack* hashTable, int element)
    Ответ написан
    Комментировать
  • Зачем определению(definition) объявлять(to declares), если есть определение(definition), которое определяет(to defines)?

    @res2001
    Developer, ex-admin
    int val;
    Является одновременно и определением и объявлением.
    В данном случае происходит реальное выделение памяти под переменную.

    Объявление это
    extern int val;
    Оно говорит компилятору, что где-то есть переменная val типа int. В этом случае компилятор уже знает какие операции допустимо использовать с этой переменной, но память под переменную не выделяет. Реальный адрес переменной подставит линковщик, когда будет собирать исполняемый файл из нескольких единиц трансляции.
    Если в одной единице трансляции вы используете объявление переменной, то где-то (в другой единице трансляции или в этой же) вы должны обязательно сделать определение. Иначе линковщик не найдя определения выдаст undefined reference.
    Если же определять переменную в каждой единице трансляции, то линковщик выругается на redefinition symbol, т.е. несколько символов с одним именем (переопределение существующего символа).
    Если вам все таки нужны символы с одним именем в разных единицах трансляции, то вы должны объявлять их static. В этом случае будет использоваться локальная для данной единицы трансляции переменная с данным именем.

    С функциями все аналогично.
    Ответ написан
  • Средство удалённого доступа?

    @res2001
    Developer, ex-admin
    RDP умеет и экран показывать и переключение пользователей, правда для этого надо немного дополнительной настройки. Режим работы remote shadow.
    Ответ написан
    Комментировать
  • Как передавать много сообщений через Socket?

    @res2001
    Developer, ex-admin
    Для передачи вы видимо используете TCP. В ТСР нет разделения на сообщения, все данные передаются в одном потоке в том порядке, в котором были отправлены. Т.е. вполне реальна ситуация, когда вы посылаете например 2 сообщения по 10 байт каждое, а читает 3 раза по 5, 10, 5 байт за раз. Таким образом разделять на сообщения вы должны на принимающей стороне самостоятельно.
    РОСО тут не причем - эменно так работает протокол ТРС. Вместо TCP можете использовать UDP - тут будете принимать именно сообщениями. Но есть сложность с дефрагментацией - если размер сообщения больше MTU, то сообщение будет фрагментировано при передаче и не факт, что куски дойдут и соберуться. Ну и еще UDP не гарантирует доставку, т.е. сообщения могут теряться и ни получатель ни отправитель об этом не узнает.
    Так же можно использовать протокол SCTP, он так же как UDP работает с сообщениями, но при этом гарантирует доставку. SCTP входит в стандартный стек TCP/IP. Есть ли его поддержка в POCO я не в курсе.
    Ответ написан
    Комментировать
  • Пытаюсь настроить double OpenVpn произошла ошибка?

    @res2001
    Developer, ex-admin
    Судя по тексту ошибки у вас все таки не находится openssl.cnf. Просто скоприуйте /usr/share/easy-rsa/openssl-1.0.0.cnf в каталог ~/openvpn-ca и переименуйте в openssl.cnf, там же должны быть и симлинки на скрипты easy-rsa, которые сделал make-cadir (конфиг то же он должен был создать).
    Оригиналы скриптов и конфигов easy-rsa лежат тут: /usr/share/easy-rsa.
    Я обычно просто руками копирую содержимое /usr/share/easy-rsa в свой каталог, т.к. бывает что-то меняю в скриптах под текущую ситуацию.

    PS: Когда я несколько лет назад решил первый раз настроить ключи для openssl с помощью easy-rsa, то обнаружил в vars ошибку, которая не позволяла скрипту правильно отработать, из-за чего остальные скрипты то же не работали. Сейчас ошибку уже поправили. А набор easy-rsa под винду вообще песня - без собственного напильника вообще нечего было ловить.
    Так что easy-rsa не сделает вам хорошо, просто немного поможет и подскажет.
    Ответ написан
  • Какой знак/символ переводит текст на новую строку в консоли?

    @res2001
    Developer, ex-admin
    >>test.txt (echo test & echo test2)
    Ответ написан
    Комментировать
  • Стоит ли изучать СИ?

    @res2001
    Developer, ex-admin
    Вопрос используется ли вообще язык СИ где то в проектах?

    Странный вопрос. Возьмите любой проект где требуется скорость/низкое потребление памяти там будет Си.
    Список популярных репозиториев на Си на гитхабе за последний месяц: https://github.com/trending/c?since=monthly
    Ответ написан
    Комментировать
  • На каком языке и с применением каких технологий, IDE лучше писать программы для Windows, которые бы занимали минимум оперативной памяти?

    @res2001
    Developer, ex-admin
    Для реализации требуемого функционала можно вообще не использовать никаких библиотек - все обеспечивает ОС API (для никсов GUI - не входит в API, предоставляемое ядром, но это не играет роли).
    Максимально маленький размер exe и потребляемой памяти можно получить на С/С++. Си чуть более компактен и быстр.
    Писать на голом ОС API достаточно долго и трудоемко, и код будет максимально далек от кросс-платформенности (хотя в вопросе про это речь не идет). Но это будет очень хороший опыт и это достаточно интересно на небольших проектах.
    Поэтому, если все же есть какие-то сроки, то следует использовать библиотеки, ускоряющие разработку. Конечно, библиотеки - это прослойка между ОС API и приложением и это увеличивает и объем исполняемого файла и объем потребляемой памяти. Но тут всегда нужно принимать какой-то компромис.
    Для GUI под винду можно использовать WTL - это компактная ООП надстройка над виндовым GUI, разработана микрософт предоставляется в исходниках (по крайней мере когда я последний раз имел с ней дело). WTL - это по любому С++. Хватает и других библиотек для GUI.

    На счет IDE - можно использовать любую - это не влияет на количество потребляемой приложением памяти.

    Я тут не говорю про ассемблер, потому что нет смысла погружаться на этот уровень без очень веских причин. Использование ассемблера еще более увеличит время разработки.
    Ответ написан
    Комментировать
  • Как сделать просто прогресс бар на Python?

    @res2001
    Developer, ex-admin
    Комментировать
  • Как добавить в массив строк новую строку в си?

    @res2001
    Developer, ex-admin
    1.Выделить новый массив размером большим на 1 элемент чем прежний;
    2.скопировать в начало старый массив;
    3.удалить старый массив;
    4.последнему элементу присвоить указатель на новую строку,
    Первые 3 пункта выполняет realloc().

    Если операция добавления нового элемента в массив регулярная, то стоит над этим поработать дополнительно. Обычно в таких случаях выделяют не на 1 элемент больше, а например в 2 раза больше. Отсюда возникают дополнительные потребности в хранении количества занятых элементов, количества всех элементов и т.п.
    Операция динамического выделения памяти - достаточно затратная, поэтому стоит свести ее к минимуму.
    Ответ написан
    Комментировать
  • Есть ли книги по winapi / c++?

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

    @res2001
    Developer, ex-admin
    В Си нету такого понятия как "ссылка" (это понятие из С++).
    В С++ ссылки используют для изменения переменных на которые ссылается ссылка.
    В Си для этого используют указатель.
    Что бы еще больше имитировать ссылку, можно аргумент функции объявлять как константный указатель:
    void func(char * const str);
    Ответ написан
    Комментировать
  • Чем опасно переполнение статического массива в C?

    @res2001
    Developer, ex-admin
    Посмотрите на код ниже:
    char a[5];
    int b = 0;
    a[5] = 'a';

    И ответьте на вопрос:
    1.Куда произойдет запись в последней строке?
    2.Программист действительно хотел именно этого?
    Учитывая, что память под стеком уже выделена ОС, то никакой ошибки при этом не происходит. Ошибка проявится где-то дальше по ходу выполнения программы, где будет использовано значение переменной b или производных от нее. Отловить подобные ошибки бывает достаточно трудно, т.к. причина ошибки и место проявления ошибки может быть сильно разнесено по коду.

    С динамической памятью все примерно то же самое, за исключением того, что теоретически выделяется только запрошенное количество памяти, поэтому выход за пределы сразу же вызовет аппаратное исключение.
    Но практически это обычно не так, т.к. обычно ОС выделяет память минимум в 4Кб (размер страницы памяти), а дальше выделенная память поступает в распоряжение менеджера памяти (malloc/free). Поэтому будет ошибка или нет зависит от реализации менеджера памяти, от количества выделяемойпамяти и т.п.
    Если не произойдет исключения, то возможно повредятся (перезапишутся) данные менеджера памяти и дальнейшие операции с памятью будут не правильными. К чему это может в итоге привести - трудно предугадать, но ясно, что ни к чему хорошему.
    Так же возможно, что никакие данные не повредятся, это вероятно еще хуже - вы думаете что программа работает нормально, но в дальнейшем вносите изменения в код и все разваливается хотя вроде бы изменения корректные. Убираете изменения - все опять хорошо. Вы думаете, что проблема в изменениях, а на самом деле нет.

    Для поиска подобных ошибок обычно используют инструменты типа valgrind memcheck
    Ответ написан
    Комментировать
  • Квадратики при открытии старого файла word, как вернуть текст?

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

    PS: и вообще там не квадратики, а единицы и двойки. Нормальный документ, содержащий кучу единиц и двоек. Сохраните на память.
    Ответ написан
    Комментировать
  • Как клонировать/мигрировать/перенести образ c HDD на SSD?

    @res2001
    Developer, ex-admin
    Можно брать и на 1000 мб.
    В общих чертах процедура описана верно.
    Я бы сделал загрузочную флэшку например из этого набора.
    Там в комплекте уже весь нужный софт есть даже в нескольких вариантах. Можете использовать например Acronis Disk Director.
    Ответ написан
    2 комментария
  • В какую бд лучше всего записывать много логов сайта?

    @res2001
    Developer, ex-admin
    Читал, что PostgreSQL нынче то же умеет хранить данные по колонкам, как clickhouse.
    Ответ написан
    Комментировать
  • Отсортировать данные о котировке акций по тикерам и по дате?

    @res2001
    Developer, ex-admin
    А что в плюсах уже стандартный std::sort перестал работать?
    Зачем вы пишете собственную сортировку пузырьком? Лучше чем в std вряд ли получится.
    Но учитывая, что
    Размер файла может быть достаточно большим для загрузки всех данных в память одновременно

    Нужно файл делить на несколько частей, помещающихся в память, каждую часть сортировать отдельно тем же std:sort, результаты сохранять в промежуточный файл. Затем результаты объединять с помощью сортировки слиянием.
    Ответ написан
    Комментировать