Задать вопрос
  • Как отсортировать данные структуры по алфавиту?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас заводится переменная str, и как и компилятор вам говорит, вы ее ничем не инициализируете. А ниже используете в strcpy(str, sot[i - 1].familia). Эта функция принимает указатель на область памяти, куда надо скопировать строку. Но указатель указывает на случайное место. Т.е. программа, даже если чудом скомпилируется, упадет с исключением.

    Вам надо или для str выделять память через malloc, или объявить str массивом char фиксированного размера, как поле familia у структуры.
    Ответ написан
    Комментировать
  • Лучшие источники для изучения CPP?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    В самую первую очередь - это будет документация языка. Ее очень удобно использовать как справочник. Это - твой самый первый источник информации по любому вопросу.
    isocpp поддерживается создателем языка и содержит море полезной информации.
    C++ Core Guidelines является манифестом пользователя C++. Его знать обязательно. Документ регулярно дополняется.

    More C++ Idioms. Шаблоны проектирования имеют свою собственную многомерную классификацию. Идиомы - это функциональные шаблоны проектирования, применимые, как правило, или для конкретного языка, или для некоторого семейства языков. Эта открытая книга помогает ориентироваться в некотором начальном наборе идиом конкретно для языка C++.
    C++ Patterns - еще один полезный ресурс для изучения применимых к C++ шаблонов проектирования.
    С Fluent C++ ты уже знаком.
    Безусловно, блог создателей PVS-Studio.
    Habr, конечно же.
    Блогов очень много, их можно просто найти по релевантной фразе "C++ blog".

    Помимо этого есть большое количество каналов от разных конференций, доклады на которых всегда помогают понять язык лучше.
    С++Russia,
    C++Now,
    Pacific C++,
    CppCon,
    code::dive,
    Meeting C++.

    Так же будет полезно изучить книги авторов:
    Андрея Александреску,
    Герба Саттера,
    Девида Вандервуда,
    Скотта Мейерса,
    Роберта Мартина.
    Есть и другие очень полезные авторы. Тут у меня, пожалуй, только самый основной список.

    Последим, и самым важным, источником будет текущая рабочая версия стандарта языка, а так же пара лабораторий для практики: Compiler Explorer и C++ Insights.
    Ответ написан
    Комментировать
  • Теряются/бьются UDP пакеты на localhost, так и должно быть?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потеря пакетов на localhost может быть, если очень много данных. Просто буфер где-то кончается и все.
    А вот битые данные - это уже 100% где-то у вас в программах ошибки.
    Ответ написан
    Комментировать
  • В чем отличие образов Consumer Edition от образов из Media Creation Tool?

    @MikeDeveloper
    В сборнике Consumer Edition присутствуют редакции Домашняя и Домашняя для одного языка, но отсутствует корпоративная редакция.

    B Business Edition же присутствует корпоративная редакция и отсутствуют домашние.

    Это объясняется тем, что сборник Business Edition ориентирован на корпоративный сегмент и позволяет использовать VL лицензии Microsoft, в то время как Consumer Edition предназначен для частных лиц и позволяет использовать самый низкий уровень лицензии Ноmе.
    Ответ написан
    1 комментарий
  • Что делает команда cls < NUL?

    Vindicar
    @Vindicar
    RTFM!
    Ну вообще < - это перенаправление ввода программы, так же как > - перенаправление стандартного вывода программы. NUL - это устройство (псевдофайл), точнее пустое устройство. Вывод в него не даёт ничего, а ввод эквивалентен чтению пустого файла.
    Вот только зачем это cls...
    Ответ написан
    Комментировать
  • Существует ли тенденция избегать size_t, если это возможно?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Если есть риск присванивания знакового значения в беззнаковое, компилятор выдаст WARNING

    Гораздо опаснее пихать всюду int, особенно в качестве индексов массивов и размеров. Потому что в какой-то момент кто-то захочет посчитать больше 2^31 штук объектов.

    Выдержка из материала по ссылке:
    большое количество диагностических сообщений, выдаваемых анализатором Viva64, связанны именно с рекомендацией использования memsize-типов. Использование memsize типов (таких как size_t, ptrdiff_t, INT_PTR) в 64-битных программах, вместо 32-битных типов (int, unsigned) позволяет:

    Построить компилятору более простой и, следовательно, более быстрый код, в котором будут отсутствовать лишние преобразования 32-битных и 64-битных данных. Особенно это полезно при работе с адресной арифметикой и индексации массивов.
    Избежать ряда ошибок при обработке большого объема входных данных, когда количество обрабатываемых элементов превышает количество UINT_MAX.
    Избежать ряда других, более специфичных ошибок.
    Сделать код более переносимым между 64-битными Windows и Linux системами, в которых используются различные модели данных. Так, например, в Linux системах для индексации больших массивов можно использовать тип unsigned long, а в Windows нет.
    Ответ написан
    7 комментариев
  • Что не так в коде?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    for (int i = 0; i < currentNodeToPrint->childNodes[1]->elements.size();i++)

    Здесь точно должен быть индекс 1, а не t?
    Ответ написан
    Комментировать
  • Как записать файл в определенное место hdd?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    Под Windows столь необычный трюк можно выполнить своим кодом, используя FSCTL_MOVE_FILE. Т.е. не создавая файл, а перемещая существующий.

    Либо накидав на диск кучу файлов, а потом с помощью nfi.exe (NTFS File Sector Information Utility), или DiskView, или fsutil querycluster посмотрев что именно лежит в интересующих вас секторах.

    То же самое можно сделать в hex-редакторе, но тут уже требуется некоторое понимание файловых систем.

    Под Linux загляните в исходники dd (в качестве потенциального источника идей) и посмотрите на --write-sector в hdparm.

    Также можно воспользоваться debugfs:
    debugfs:  testb 100500
    Block 100500 marked in use
    debugfs:  icheck 100500
    Block   Inode number
    100500  1488
    debugfs:  ncheck 1488
    Inode   Pathname
    1488    /home/psiklop/hentai.mkv

    Кроме того, в своё время был DiskExplorer, но RunTime, по-моему, очень давно не обновляли свои инструменты, так что не знаю насколько оно работает сейчас.

    нужная прога вылетает

    Если же говорить в целом, то сама по себе такая идея - не очень. У вас уже пошли вылеты, а в будущем диск здоровее не станет, только продолжит покрываться бэдами.
    Так что запись файлов, создание разделов вокруг, лечение (remap) и прочие ухищрения относительно bad block'ов - это пластырь на умирающую лошадь.

    Забэкапьте содержимое всего диска и попробуйте сдать его по гарантии, если она не закончилась. Если закончилась, то используйте как свалку для того, что не жалко потерять.
    Ответ написан
    1 комментарий
  • Внесение данных в std::vector< GLfloat >?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Вектор перед работой с его индексами необходимо привести к требуемому размеру.
    Делается это с помощью метода resize[?].
    После этого можно обращаться к значению по индексу напрямую.

    Если размер вектора уже определен и необходимо именно вставить данные по индексу, то воспользоваться можно методом insert[?].
    Однако, первым параметром метод требует не индекс, а итератор внутри вектора, куда требуется выполнить вставку. Этот итератор можно получить через смещение итератора начала вектора на требуемый индекс.
    vertexBuffer.insert( vertexBuffer.begin() + 1, x );

    При этом важно контролировать чтобы индекс вставки не выходил за пределы размера вектора.
    Забывать не стоит и о том, что при вставке велика вероятность реаллокации памяти под элементы вектора, в следствии чего уже все итераторы и ссылки на элементы вектора будут инвалидированы.
    Ответ написан
    1 комментарий
  • Существует ли тип данных int?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Есть три типа данных - short int, int и long int.
    Компилятор не решает, какого типа будет переменная. Программист должен объявить это явно.
    Компилятор решает, какого размера будет переменная каждого типа.
    Ответ написан
    1 комментарий
  • Почему lambda не захватывает this?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Банальная порча всех итераторов, ссылок и указателей в тот момент, когда вы вызываете emplace у вашей свалки потоков второй раз. Лечение - избавиться от переаллокации при вызове emplace, путем вызова reserve(), или использовать контейнер, который не передвигает свое содержимое туда-сюда, например, std::list
    Ответ написан
    Комментировать
  • Почему постоянно "вылетает" диск из рейд массива на контроллере PERC H710P Mini?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    Firmware Version 21.0.2-0001

    Я бы начал отсюда. Эта версия прошивки от мая 2012-го.
    "Стандартный рубеж" в 2 ТБ этот контроллер явно проходит, но всё-таки 10 лет назад и речи не шло о 16 ТБ дисках.
    Попробуйте обновиться до самой последней версии.

    Второй момент уже тоньше. Размер сектора.
    Ваш контроллер точно поддерживает диски с секторами по 512 байт. А вот с 4K - всё-таки вопрос.

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

    ЕМНИП, диски с 512e доходили до 10 ТБ, но это хорошо было бы уточнить по даташитам. Так что если у вас вдруг есть возможность проверить эту идею с помощью других дисков - проверьте (оптимально, если они будут, например, по 12 ТБ).

    Сервис ответил "диск рабочий"

    Вы сами можете проверить диски с помощью Р.тестера: https://rlab.ru/tools/rtester.html
    Можно попробовать в т.ч. и на сервере - если вылезет что-то непотребное, то сопутствующая этому моменту информация может дать пищу для размышлений.
    Размер сектора можно посмотреть там же, как и здоровье остальных дисков, если нужно. Р.тестер, к примеру, умеет показывать SMART для SAS-винчестеров.
    Ответ написан
    1 комментарий
  • Как повысить свои навыки в построении архитектуры сложных приложений?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    1. Хорошо помогает начать изучение с простых паттернов проектирования. Прежде всего это простые и понятные паттерны типа "стратегия", "команда", "итератор", "шаблонный метод", "посредник", "цепочка обязанностей". Изучив и поняв эти паттерны вы посмотрите на ООП по новому: не как просто структурированный код плюс данные в одном объекте, а именно как задумывалось его создателем - объект самостоятельная единица взаимодействующая с другими такими же посредством сообщений. Причём она является first class также как в функциональном программировании функция. К тому же на указанных паттернах строятся и остальные. Например, фабричный метод - это частный случай шаблонного метода. Так постепенно придет понимание куда и зачем применять различные паттерны.
    2. Когда решаете какую-либо задачу, думайте о нескольких вариантах архитектуры для её решения. Далее старайтесь выбирать
    вариант не на основе личных предпочтений или предыдущего опыта (не важно, положительного или отрицательного), а на основе анализа, какой из вариантов здесь реально потребуется с точки зрения дальнейшего развития проекта. Предыдущий опыт также надо учитывать, но все проекты разные, требования разные, и каждая ситуация может отличаться. Надо смотреть как могут изменяться или расшириться системные и функциональные требования (разумеется, для этого надо быть в контексте этих требований - т е знать их самих, манеру работы с проектом заказчика и т д) Во многих случаях, когда вы не сможете выбрать из-за недостатка информации, это логически подведёт вас задавать заказчику дополнительные вопросы. И через этот итеративный процесс приходит понимание, где и как применять паттерны.
    3. Обратите внимание на паттерны ERP систем (для примера книга "Шаблоны корпоративных приложений" Мартин Фаулер) Особенное внимание надо уделить такому шаблону как инверсия зависимостей. Данный шаблон лично мне помог совершенно по другому взглянуть на ООП (во второй раз, уже после того как я стал применять другие паттерны ООП) Вот здесь https://blog.byndyu.ru/2009/12/blog-post.html очень понятно на мой взгляд описано (язык C# но всё тоже самое будет для любого ОО языка) Кроме того в этом блоге много всего по проектированию и рефакторингу.
    4. Обратите внимание на книгу "Growing Object-Oriented Software, Guided by Tests" Стив Фриман Перевод на русский не гуглится, возможно его и нету. Но книга полезна тем, что в отличие от многих других книг по TDD в ней разбирается не только методика тестирования и написания тестов, но и принцип тест -> код -> рефакторинг. И разбирается на достаточно длинном примере. Из неё вы можете подчерпнуть привычку рефакторить, а не переписывать заново. Причём даже если у вас на проекте цикл другой - например тесты пишутся после функционала, всё равно образ мысли изменится и масштабный рефакторинг не будет вызывать непреодолимого желания выбросить и переписать с нуля.
    5. По рефакторингу могу порекомендовать книгу "Работа с унаследованным кодом" Майкл Физерс. Кроме того об этом много статей в уже упомянутом блоге Александра Бындю. Грубо говоря я бы назвал ту подборку статей "как не переписывать и начать жить"
    6. Ещё один блог где собрано большое количество полезных материалов по ООП, рефакторингу, проектированию, это блог Сергея Теплякова Вот ссылка на его подборку книг по теме: sergeyteplyakov.blogspot.com/2013/08/blog-post.html
    7. Изучайте материалы постепенно. Не стоит сразу пытаться воткнуть только что полученные знания в первый попавшийся проект. Обсуждайте возможные решения с коллегами. Со временем они также станут поддерживать эту практику. Если есть возможность, попрактикуйте парное программирование. Причём не обязательно с более опытным коллегой. Иногда вопросы задаваемые наивным человеком заставляют задуматься гораздо крепче, чем ответы получаемые от мудрецов.
    Ответ написан
    1 комментарий
  • Как подключится к ноутбуку(Wi-Fi) с компьютера (Ethernet) в одной сети (роутер) по RDP?

    @rPman
    Скорее всего на машине к которой подключаешься включен фаервол, с настройками по умолчанию блокирующий все подключения извне.

    В настройках фаервола необходимо отключить его для работы в локальной сети, выбрать тип сети - частная (по умолчанию она - общедоступная)
    Ответ написан
    5 комментариев
  • Куда пойти в IT немножко зная R?

    @dmshar
    О чем вы говорите? "Создание модели линейной регрессии и последующего прогноза" - ?? Да это студенты на 2-м курсе нынче изучают, а может и на первом. Любой технической специальности. Программирование на R? Тот, кто умеет программировать на любом - подчеркну, любом - языке программирования, осваивает R (именно - программирование, как таковое) за неделю.
    У меня есть к ТС вопрос. Вот представьте, если бы некий специалист в области информационных технологий и DataScience где то в своей работе описал регрессионную модель "продуктивности растительных сообществ" и после этого, считал, что с легкостью может найти работу в области экологии и биологии. Вы бы посмеялись?
    (По секрету скажу, что за свою жизнь я принимал участие в разработке как минимум четырех различных медицинских систем, некоторых - реально - очень больших и сложных. И что, я могу всерьез наедятся заняться медицинской практикой?)
    Почему-же вы считаете, что переход в обратном направлении более легок?
    Вот как-то примерно так.
    Если вы планируете переезд, то надо четко себе уяснить, что это на просторах пост-СССР разница зарплат программиста и эколога ли биолога существенна. Но вот на просторах цивилизованного мира - особой разницы (в среднем) нет. Поэтому на вашем месте я бы не шарахаться по разным специальностям стал, а подтягивать иностранный, скилзы по основной специальности, искал бы для начала стажировки или post -docs места. Шансов на успех явно будет больше.
    Ответ написан
    2 комментария
  • Кодирование IP-пакетов в звук?

    gbg
    @gbg Куратор тега Компьютерные сети
    Любые ответы на любые вопросы
    Поздравляю, вы изобрели модем.
    В некоторых старинных мобилках он присутстовал и позволял делать именно то что вы хотите.
    Важно понимать разницу между GSM модемом, GPRS, 3G и 4G. Данные в голосовом канале передает только первый из списка.

    Его можно
    -купить как отдельное устройство
    -купить в составе старинного сотового телефона
    -сколхозить даже из современного телефона, провода для гарнитуры и модема | софта, эмулирующего модем
    Ответ написан
    9 комментариев
  • Почему служебные символы работают не везде?

    karabanov
    @karabanov Куратор тега Linux
    Системный администратор
    bash так не умеет, после раскрытия аргументов возникает неоднозначность ввиду большого количества аргументов (собственно в сообщении об ошибке так и написано "ambiguous redirect").
    Можешь воспользоваться утилитой tee, она так умеет, например:

    cat 1.txt | tee {2,3,4,5}.txt 1>/dev/null

    tee направляет вывод в файл и на стандартный вывод, можно не добавлять 1>/dev/null, тогда содержимое файла будет так же выведено на экран, но врятли это требуется в данной ситуации.
    Ответ написан
    4 комментария
  • Почему программа на Си молчит?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что atoi(const char * string)
    Ответ написан
    Комментировать
  • Assignment operator VS Destructor + Placement new, где аргумент placement new - prvalue?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    К современному коду предъявляется немало требований. В частности, код должен отвечать определенным критериям качества чтобы иметь шансы на добавление в основной репозиторий в качестве решения задачи.
    Среди таких критериев качества нередко бывают: соответствие общему стилю кода, соответствие общему стилю форматирования, наличие документации или самодокументируемость, а так же - элементарная понятность для читателя.

    Читатель современного кода не должен задаваться вопросами: что тут делает ядовитый газ, зачем швабры и почему вентилятор такой большой [?].
    Читателю все должно быть понятно практически сразу, у него должно возникать как можно меньше вопросов.

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

    *reinterpret_cast<T*>( &buffer[ sizeof( T ) * head ] ) = T{ std::forward<Args>( args )... };

    Да, тут присутствует Value Initialization и оператор перемещения. Однако, оптимизация этого кода сведет все к довольно короткому и как можно более быстрому коду. Поэтому не стоит беспокоиться об этом на текущем этапе. Лучше беспокоиться о понятности кода для читателя.
    Столь же понятным будет и такой код:
    auto T vicar{ std::forward<Args>( args )... };
    std::swap( *reinterpret_cast<T*>( &buffer[ sizeof( T ) * head ] ), vicar );

    Он не будет вызывать много вопросов, разве только вопрос относительно использования std::swap, но только от людей со слабой привычкой пользоваться STL.

    Однако, такой код может привести к ошибке трансляции в том случае, если T является неперемещаемым. В твоем ЦБ должны присутствовать проверки на перемещаемость, копируемость и возможность размена состояний.
    Если T можно копировать, но не перемещать, использовать стоит оператор копирования.
    И только если ни копировать, ни перемещать T нельзя, следует пользоваться деструктором и размещающим конструктором.

    Я бы рекомендовал все три действия оформить в виде перегрузок шаблона функции со SFINAE, чтобы для любого T включалась только одна конкретная перегрузка шаблона.
    Ответ написан
    6 комментариев
  • В чем разница между delete и nullptr?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    g = nullptr не удалаят память, оно просто записывает в переменную g значение со смыслом - "указатель вникуда". Память при этом остается нетронутой и к ней можно обращаться, что вы и делаете, запомнив указатель в другой переменной.

    delete[] же освобождает память, а значит, все последующие обращения к ней, что при помощи g, что при помощи gg - будут вызывать UB
    Ответ написан
    Комментировать