• Почему не работает функция?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Проблема в том, что код функций из шаблонов генерируется по мере надобности.
    Вот встретил компилятор где-то Test<int> - и начинает создавать функцию для int.
    Но в единице трансляции с Functions.cpp он этого не встретил и ничего не генерирует. А когда он компилирует Source.cpp он может только сгенерировать декларацию, но не определение функции. Ведь он видит хедер, но не что написано в Functions.cpp.

    Поэтому, если весь шаблон определять в .h файле то компилятор сможет сгенерировать что ему надо всегда.

    Второй варинат решения проблемы - в Functions.cpp указать компилятору, что шаблон будет использоватся с такиим-то типами:
    using Test<int>;

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

    Обычно минусы тут перевешивают плюсы и шаблоны всегда целиком пишут в хедерах. Но это не единственный враиант. Неправда, что шаблоны должны целиком находится в хедерах.
    Ответ написан
    Комментировать
  • Какая сложность у такого цикла for?

    wisgest
    @wisgest
    Не ИТ-специалист
    Да. Цикл выполнится столько раз, сколько значащих двоичных цифр в N. Количество цифр в записи натурального числа N без возможных незначащих ведущих нулей приблизительно равно его логарифму (целая часть логарифма N+1 по основанию системы счисления).
    Ответ написан
    Комментировать
  • Почему выводит 0?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что вы делите меньшее целое число на большее и получаете целый ноль.
    Ответ написан
    Комментировать
  • Как в указатель на базовый класс вложить ссылку на класс наследник?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Правильно - вот так:
    object = new Kvadrat();

    Теоретически, можно было бы делать как вы пытаетесь:
    object = &kv;

    Но конкретно в вашем коде - это будет UB, потому что kv - это локальная переменная и у нее очень огранниченная область видимости - внутри if. И вот за пределеами этого if, где вы и попытаетесь, очевидно, использовать указатель object, эта локальная переменная будет уже уничтожена. У вас будет т.н. висячий указатель - указывающий туда, где данные были, а сейчас там может быть все, что угодно.

    Поэтому, если вы присваиваете указателю адрес какого-то объекта (&) вам надо убедиться, что время его жизни не меньше, чем у указателя, пока вы будете его использовать. Можно, например, сделать переменную глобальной, но это очень плохой код. Лучше завести все 4 разных класса в начале функции, потом прочитать нужный и взять указатель на него. Этот подход иногда даже используется на практике.

    Но лучше, все-таки, не плодить лишних сущностей и создавать объект сразу в куче с помощью new. Тогда он сам нигде не уничтожится.
    Ответ написан
    1 комментарий
  • Как создать новый поток внутри метода класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В документации есть пример:
    std::thread t5(&foo::bar, &f); // t5 runs foo::bar() on object f


    У вас надо cделать: std::thread t5(&A::Zoom, this);
    Ответ написан
    Комментировать
  • Как эффективно и лаконично отсортировать файл из строк не вмещающихся в память?

    Adamos
    @Adamos
    А зачем вам вся строка для сортировки?
    Вам она нужна только до того байта, который не совпадет с другими строками.
    Взять от каждой строки по 64Kб, отранжировать по отличиям в этой части, продолжить читать только у тех, у которых она совпадает. Повторять чтение кусков до прекращения совпадений.
    Ответ написан
    5 комментариев
  • Что означают эти формулы?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    "E" (это вообще-то сигма из греческого алфавита) - знак суммы. выражение справа надо просуммировать, подставив вместо k все числа от 3 до n. П - это знак произведения. Выражение справа надо перемножить для всех указанных значений i.

    Поскольку тут в выражении П есть переменная k, связанная в сигме, то можно однозначно сказать, что перемножение идет внутри суммы.

    Ваше решение в вопросе почти правильное. Проблема только в том, что вам надо подсчитать что-то вроде c1*a1*a2*a3 + c2*b1*b2*b3. А вы используете одну и ту же переменную для подсчета каждого слагаемого и общей суммы. У вас получается что-то вроде (c1*a1*a2*a3+c2)*b1*b2*b3
    Ответ написан
    2 комментария
  • Как получить остаток огромного числа?

    hint000
    @hint000
    у админа три руки
    Не нужно тут вообще никаких циклов, ответ сразу известен: (N*(N-1)/2)%N.
    Потому что остаток от деления суммы равен остатку от деления суммы остатков - вполне очевидно.
    А сумма остатков как раз и равна (N*(N-1)/2).
    Ответ написан
    Комментировать
  • Как работает выделение памяти malloc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    char *str = malloc(0);
    Правильно ли я понимаю, что в str находится начало выделянно памяти на 0 байт


    Вот что говорит стандарт (c99, 7.20.3:1) о выделении 0 байт через malloc:

    If the size of the space requested is zero, the behavior is implementation-
    defined: either a null pointer is returned, or the behavior is as if the size were some
    nonzero value, except that the returned pointer shall not be used to access an object.


    Поскольку твоё обращение к этой памяти не вызывает SEGFAULT, то да, malloc вернул не NULL. Сколько байт реально было выделено зависит от реализации.

    а дальше идет запись символов в память, которая для нас не предназначалась?


    Да. Использовать эту память согласно стандарту нельзя.
    Ответ написан
    Комментировать
  • Как расставить приоритетность выполнения арифметических операций в bat?

    wisgest
    @wisgest
    Не ИТ-специалист
    Как уже сказал Sergei Nazarenko, можно экранировать скобки (достаточно закрывающие), но лучше взять выражение в кавычки. В set /a не следует без необходимости и понимания заключать имена переменных в знаки процента, так как в этом случае их значения будут подставлены до выполнения составной команды, что приведёт к ошибкам, например, в цикле.
    set /a "sum = (x + x) * c * x"
    или
    set /a sum = "(x + x) * c * x"
    Ответ написан
    Комментировать
  • Как убить процесс который сам перезапускается?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Та, что он disabled, не значит, что он не started.
    И сам себя процесс, убитый по - 9 по определению перезапустить не может. Кто-то ожидает его завершения, и перезапускает.
    Нужно посмотреть на pid родителя, найти засранца и придавить.
    Ответ написан
    3 комментария
  • Robocopy, копирование с разных хостов на сервер?

    nazares
    @nazares
    Software Engineer
    я бы сделал через PowerShell берешь список хостов перебираешь их в цикле и подставляешь в
    Copy-Item -Path \\serverb\c$\programs\temp\test.txt -Destination \\servera\c$\programs\temp\test.txt;
    Но боюсь так как ты новичок и если powershell не настроено на удаленных машинах то с этим возникнут проблемы.
    там надо будет Enable-PSRemoting и Set-ExecutionPolicy или подписывать (code-sign) свои скрипты.

    https://learn.microsoft.com/en-us/powershell/modul...
    https://learn.microsoft.com/en-us/powershell/scrip...
    Ответ написан
    1 комментарий
  • Как устроены хэштаблицы?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Сначала выделяется массив какого-то размера, например 256. Обычно длина - степень двойки. Потом хеш обрезается до размера таблицы. Если элементов становится слишком много, то происходит перехеширование - размер таблицы увеличивается, и все элементы в нее перезапихиваются.

    Но да, если в таблицу запихать много элементов, а потом почти все оттуда удалить, то она будет большая и почти вся пустая.

    Edit:

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В чём же проблема?
    for (int i = strlen(sentence); i >= pos; i--) {
        sentence[i + 1] = sentence[i];
        sentence[pos] = ' ';
      }

    Должно быть
    for (int i = strlen(sentence); i > pos; i--) {
        sentence[i + 1] = sentence[i];
      }
      sentence[pos + 1] = ' ';
    Ответ написан
    Комментировать
  • Как сделать азбуку Морзе в обратную сторону?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Если нет пауз между буквами, то задача однозначно не решается:
    Например, "vz" и "3d" одинаково кодируются "...---.." ("...-- -.." и "...- --..").
    В худшем случае, неправильная интерпретация первых символов может сделать расшифровку в самом конце невозможной.

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

    Тогда надо разбить строку на отдельные "слова" - группы тире и точек, разделенные пробелами и каждую группу перевести в букву по таблице. Таблицу в идеале надо хранить в trie ("бор" по русски), но эта структура не реализована в стандартной библиотеке C++, поэтому можно воспользоваться просто std::map<std::string, char>

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    int a[10];
    12 -ввел пользователь
    Ответ написан
    Комментировать
  • Быстрый старт в IT с хорошей базой?

    @vism
    В офис идите опыта сперва набраться.
    В 99% процентах случаев нужно понимание бизнес задач, понимание как сделать удобно для клиента софта, общение с менеджером и командой.
    Ответ написан
    Комментировать