Задать вопрос
  • В чем разница const char* и char const*?

    @res2001
    gleendo, Вообще без понятия.
    К тому же от компилятора к компилятору строка, возвращаемая typeid().name() может различаться для одного и того же типа. И не факт, что в другом компиляторе const не будет указан в первой позиции.

    Разработчики так пишут, видимо, потому что в книжках это наиболее частая запись. Но я встречал и второй вариант в реальных проектах.
  • В чём разница между статическими либами и пакетами?

    @res2001
    Только не .о! Или .so или .a
    Освойте утилиту pkg-config, она покажет все нужные пути. Ее можно использовать совместно с makefile или в cmake (наверняка и в других системах сборки то же). В параметрах надо задавать имя конфигурационного файла pkgconfig, который установила библиотека и pkg-config покажет всю нужную информацию для подключения библиотеки к своим исходникам.
    Если правильно помню, то в линухе конфиги pkg-config могут лежать в /usr/lib/pkgconfig, /usr/share/pkgconfig, и дополнительно в тех же каталогах, но с префиксом /usr/local. Возможно еще где-то, сейчас негде посмотреть. Конфиги представляют собой файлы с расширением .pc. Уважающие себя библиотеки ставят в своем -dev пакете в т.ч. и конфиг pkg-config. Названия файла конфига можно посмотреть в составе пакета с помощью dpkg -L libfftw3-dev или найти вручную в соответствующем каталоге. Как правило, название конфига как-то созвучно имени библиотеки.
    Посмотрите опции pkg-config, чтоб получать только нужную информацию.
  • В чём разница между статическими либами и пакетами?

    @res2001
    Не надо вам make & make install, у вас и так уже все стоит из пакетов. По возможности, стоит избегать этих команд и ставить все из пакетов.
    Просто подключайте библиотеку к вашей программе.

    Обычно в линуксах библиотеки разбивают на 2 пакета, в первом пакете по имени библиотеки находится сама скомпилированная библиотека, маны, что-то еще необходимое для работы библиотеки. В пакете с суффиксом -dev находятся файлы, необходимые для разработки программ с использованием этой библиотеки (например заголовки, конфиг для pkgconfig и т.п. программистские штуки).
  • Почему именно при таком обращении к матрице мы получаем все ее элементы?

    @res2001
    LevSvl08, Прочитал в комментариях, что двумерный массив у вас объявлен статически/автоматически.
    В этом случае тип matrix является int[10][10]. Используя первое разыменование мы снимаем первую размерность и получаем после *(matrix + i) тип int[10] и дальше имеем право разыменовывать еще раз.
    Для наглядности набросал примерчик, посмотрите вывод: https://gcc.godbolt.org/z/jn9W7vMG5

    Для статических/автоматических массивов лучше не использовать разыменование, чтоб не вводить самого себя в заблуждение. Используйте индексацию. Статический/автоматический массив это не то же самое что указатель, хотя работают местами похоже, но в некоторых случаях различаются.
    Например посмотрите чему равен sizeof автоматического массива и чему равен sizeof указателя (последняя строка примера).
  • Почему именно при таком обращении к матрице мы получаем все ее элементы?

    @res2001
    LevSvl08, Как у вас объявлен matrix? Приведите кусок кода с объявлением matrix и его инициализацией.
    Подозреваю, что это что-то типа:
    int **matrix;
    2 звездочки означает указатель на указатель на int. Соответственно возвращаемый тип первого разыменования *(matrix + i) это int*, а раз это указатель, то мы его можем разыменовать еще раз и только после второго разыменования получим значение элемента.
    Но при таком варианте матрицы надо иметь ввиду, что память выделять для подобной матрицы нужно следующим образом:
    matrix = new *int[N];
    for(int i = 0; i < N; ++i) { matrix[i] = new int[N]; }

    Соответственно аналогичным образом и удалять матрицу, освобождая каждый элемент первого массива. Посчитайте сколько вызовов new получается, столько же должно быть и вызовов delete[].
    По сути это не двумерный массив, а одномерный массив каждый элемент которого является массивом (массив массивов).
    Такой подход имеет право на существование, но он не оптимальный с точки зрения производительности.

    Если важна скорость работы с матрицей, то имеет смысл использовать подход описанный mayton2019 и выделять память под всю матрицу одним куском. Но в таком случае вы не сможете использовать операцию двойной индексации matrix[i][j] (догадайтесь почему), индекс придется вычислять вручную, способом указанным в ответе mayton2019.
  • Ростелеком блокирует трафик VPN?

    @res2001
    ВПН нельзя распаковать - это технология, и уж тем более ростелеком не реагирует на действия архиватора на вашем компе.

    Если у вас "браузерный" ВПН и если ВПН сервер не доступен, то любые действия в браузере будут "заблочены", но это не вина ростелекома.

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

    Что бы помочь с вашей проблемой нужно больше конкретики: Какая ОС у вас на компе? Какой ВПН используете? Предоставьте конфигурационные файлы ВПН клиента и сервера (если есть). Как вы проверяете доступность интернета?
  • Есть ли хорошие книги для глубокого изучения Linux?

    @res2001
    В этой книге описан Linux UserSpace API, т.е. набор интерфейсов с помощью которых прикладной пользовательский софт общается с ядром. Описание внутренностей ядра тут не найдете.
    Автор книги является писателем man страниц, так что книга, представляет собой печатный man по Linux API.
    Для прикладных программистов книга хорошая.
  • Возможно сделать иначе?

    @res2001
    LIREN, Смотрите пример по ссылке, там и заполнение и выравнивание и задание ширины полей есть. Немного поэкспериментируйте и читайте документацию. Все получится.
  • Что должен уметь делать Python разработчик?

    @res2001
    Математика в программировании нужна только в некоторых областях, где она используется. Например математические рассчеты и моделирование, ИИ, ЦОС, gamedev.
    Но для программиста математика полезна в том смысле, что она близка к программированию по "способу" мышления. Т.е. если у вас с математикой нормально, то велики шансы, что и программирование взлетит. Если нет - может не взлететь. Или взлетит, но придется приложить больше усилий. Как-то так.
    Букварь надо учить и таблицу умножения. А питон надо ... тренировать. Делайте больше практических упражнений. Придумайте свой проект и попытайтесь его реализовать.
  • Как корректно отслеживать завершение потоков?

    @res2001
    Не знал, что такое есть.
    Но надо иметь ввиду, что это
    These functions are nonstandard GNU extensions; hence the suffix "_np" (nonportable) in the names.

    т.е. не стандартное расширение gcc.
  • Как корректно отслеживать завершение потоков?

    @res2001
    CommonX,
    Есть ли вариант проще?

    Вы кроме первого абзаца моего ответа ничего не прочитали? Или варианты не подходят?

    Когда вы проверили другими средствами, что поток завершился, то вызов join не будет ждать. Чего ждать, когда поток уже завершен? Он сразу вернет управление.
  • Собрал ПК, вечные синие экраны (bsod) с разными ошибками. В чём проблема?

    @res2001
    Даник, Похоже все таки проблемы с памятью.
    Т.к. комп у вас новый, то рекомендую добиться воспроизводимости ситуации и нести комп в сервис продавца, там опишите как воспроизвести ошибку. Пусть диагностируют, замена должна быть гарантийной.
  • Почему считывается с файла только 1 слово, а не весь текст?

    @res2001
    ashot_powershot, Да и еще.
    Вам нужно определится вы хотите записывать файл в двоичном режиме или в текстовом.
    Если в двоичном, то и открывать файлы нужно в двоичном и применять подход с сериализатором, о котором я писал.
    Если в текстовом, то с длинной address можно поступить еще другим способом. address.c_str() писать после всех числовых данных, как последнее поле. И после адреса добавлять в файл перевод строки. Таким образом у вас на одной строке будет распологаться 1 объект.
    При чтении, сначала читаете числа, затем оставшуюся строку до символа конца строки - это и будет address.

    Вообще при чтении данных из любого потока (файл, сеть, буфер и т.д.) есть только 3 варианта отделить одно поле от другого в потоке:
    1. Вы изначально знаете размер поля в потоке и читаете именно столько байт, сколько требуется. Это работает для всех стандартных числовых типов.
    2. Если данные переменной длины (std::string), то
    2.1. Сначала пишем длину данных. Сама длина данных должна иметь фиксированный размер, затем читаете данные. Длину надо писать до самих данных, что бы при чтении сначала прочитать длину и определить сколько после нее идет данных.
    2.2. Используете разделитель. Т.е. пишете данные переменной длинны и в конце данных вставляете символ разделитель. Это как раз вариант с переводом строки, где символ перевода строки является разделителем. Если бы у вас в классе Home было несколько строк, то их можно было бы писать друг за другом вставляя между ними какой-то другой разделитель, например символ '\0'
    Других вариантов не существует.
  • Почему считывается с файла только 1 слово, а не весь текст?

    @res2001
    ashot_powershot, Писать напрямую, можно только те классы, которые содержат в качестве членов данных только простые типы (POD) и не содержат виртуальных функций.
    Таким образом можно немного схитрить. Например заменить string address, на char address[MAX_ADDRESS_LENGTH]; И тогда можно не писать сериализатор, и записывать в файл напрямую (как сейчас).
    Но я бы не советовал так делать. Вам нужно понять проблему и научится ее решать, т.к. на практике это встречается очень часто и не всегда эту проблему можно обойти.
  • Почему считывается с файла только 1 слово, а не весь текст?

    @res2001
    ashot_powershot, Так и есть. Проблемы у вас из-за string address;
    std::string нельзя вот так на прямую сохранять в файл и читать.
    Причину и решение описывал выше.

    Когда вы пишите std::string в файл, то писать нужно не сам объект, а std::string.c_str() и еще перед этим надо записать длину строки, чтоб потом знать сколько байт из файла надо прочитать для строки.
    Конкретно для вашего класса, можно поступить немного по другому, перед записью класса вычисляете общую длину класса, затем пишете home, floor, room, square как обычно. Длина address вычисляется из длины класса - sizeof(home, floor, room, square). Длина класса при этом это не sizeof(Home), а sizeof(home, floor, room, square) + address.size().

    В общем добавляете к классу 2 метода сериализатор и десериализатор.
    Сериализатор принимает в параметре ostream и пишет класс в поток, как я описал выше.
    Десериализатор принимает в параметре istream и загружает класс из потока в обратном от записи порядке.

    Это касается не только std::string, но и любых объектов, у которых в данных есть указатели или ссылки. Например std::vector, да и любой контейнер из std. А так же любой ваш собственный класс. Все подобные классы требуют специального подхода для записи и чтения.
    Аналогично классы с виртуальными методами, т.к. в таких класса, помимо данных самого класса, есть еще и указатель на таблицу виртуальных функций, которую не нужно сохранять в файл (и читать из файла).
  • Собрал ПК, вечные синие экраны (bsod) с разными ошибками. В чём проблема?

    @res2001
    Даник, На голой свежеустановленной винде удалось повторить сбой?
  • Собрал ПК, вечные синие экраны (bsod) с разными ошибками. В чём проблема?

    @res2001
    Даник,
    Оставьте минимальное количество подключенного железа,

    Это делал? Физически отключить все диски, видео (оставить набортное, если есть), что-то еще, оставить 1 плашку памяти. С такой минимальной конфигурации надо начинать тесты с помощью диагностической флешки.

    Тут уже писали о случаях, когда материнка коротит о корпус, то же исключить.
  • Собрал ПК, вечные синие экраны (bsod) с разными ошибками. В чём проблема?

    @res2001
    Даник,
    Проблема в том, что я не могу вызвать синий экран.

    Значит надо попытаться вызвать эти обстоятельства. Сначала на голой свеже установленной винде. Увеличьте время тестирования.
    Затем добавляя по одному драйверу или софту. Как начнутся сбои - виновник, скорее всего, последний установленный драйвер/софт.
    Если сбои начнутся на голой винде - несите комп в сервис продавца, проблема все таки аппаратная.

    Если нагрузочные тесты и тесты видео не вызывают сбоев, то видимо с охлаждением все нормально.

    На самом деле, подобные непредсказуемые сбои, похожи на проблемы с оперативной памятью или с блоком питания. Проблемы с памятью выявляются тестами. С блоком питания в домашних условиях - только заменой на заведомо исправный и достаточной мощности.
  • Как получить размер страниц по списку?

    @res2001
    Как связан cmd и ssh?
    Через cmd встроенными средствами сделать нельзя.
    Если найдете какую-то стороннюю консольную утилиту, которая может выдавать эту информацию, то можете в скриптах использовать ее.