Задать вопрос
  • Чем наследования (extends) отличается от создания новых экземпляров классов (new)?

    Denormalization
    @Denormalization
    Класс Car - это трафарет.

    Оператор new - это создание ИЗДЕЛИЯ по этому трафарету
    extends - это создание нового трафарета (возможно с дополнениями) по которому можно создавать изделия.

    Между созданием изделия и создание нового трафарета есть разница?
    Ответ написан
    Комментировать
  • Как назвать функцию?

    is_seconds_elapsed()
    можно более развернуто:
    is_seconds_elapsed_since()
    Но с таким названием возвращаемые значения должны быть изменены - если разница превысила, то возвращается true.
    Я лично предпочитаю инвертировать при помощи !, а не использовать not в названии функции, чтобы при необходимости инвертировать значение, возвращаемое функцией, не получилось использование ! и not одновременно - двойное отрицание может запутать при чтении кода.

    Ну а вообще, лучше функцию назвать так, чтобы код читался, как предложение. То есть пожертвовать универсальностью в пользу читабельности:
    if ($this->readyToProcess($timestamp, $seconds))
    {
        // do stuff
    }
    Ответ написан
    Комментировать
  • Как эффективно использовать ресурсы сервера?

    @asd111
    нужно использовать механизм обмена сообщениями операционной системы т.е. например epool, kqueue и т.п. - реализованы в библиотеках libevent, libev
    В таких случаях обработка происходит только после получения данных, а пока данных нет система ждет
    Ответ написан
    Комментировать
  • С точки зрения лексем языка си минус это?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Минус в том и другом случае это отдельная лексема?

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

    Если это так, то как сказать распознавателю, что -1 неделимая структура?

    -1 с точки зрения стандарта С -- это выражение: унарный минус применённый к константе, а не неделимая структура.
    Ответ написан
    Комментировать
  • Python: как лучше удалить пустые строки и строки с 1 символом из текста?

    @766dt
    strings = (line for line in lines if len(line) > 1)
    
    for string in strings:
        print(string)
    Ответ написан
    Комментировать
  • Python: как лучше удалить пустые строки и строки с 1 символом из текста?

    valerium
    @valerium
    Изобретая велосипед
    sed '/^.?$/d' -i~ /path/to/file
    Быстрее Вы не сделаете, особенно на Python.
    Ответ написан
    Комментировать
  • Как оптимальней?

    @deliro
    break
    Ответ написан
    Комментировать
  • Как сохранить в кэш интовое значение?

    @deliro
    Кажется, вы не понимаете, что такое кэш.
    Можно хранить в файле настроек (.ini, .conf)
    Ответ написан
    Комментировать
  • Зачем return в программе?

    @MiiNiPaa
    Вот если указано return 0; - то программа закончиться.Я правильно понимаю?
    Только если это return в main().

    return это команда закончить текущую функцию (и вернуть значение вызыающей функции)

    А если ничего не указать?Она будет в памяти висеть или что?
    С 1998 года она выполнит return 0 (опять же, справедливо только для main() ) как только достигнет конца функции main().
    Т.е. если указываешь 0, то это типа false.
    Это EXIT_SUCCESS.
    А если указать 1?
    Implementation defined. Обычно работает так же как и EXIT_FAILURE.

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

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Объяснить суть полиморфизма "на пальцах" довольно просто. Представьте себе класс Телефон. Его спроектировал некто в далеких 80-х, и определил в нем метод набратьНомер(). А потом другой программист в 90-х отнаследовал от него класс МобильныйТелефон и перекрыл метод набратьНомер(), т.к. грубо говоря, в новом устройстве набор производится уже не импульсно, а тонально. А потом третий программист отнаследовал от него класс Смартфон. При этом он не стал трогать метод набратьНомер(), а просто добавил методы для нового функционала, типа определитьПоложениеПоGPS() и т.д.

    Теперь представьте себе пользователя. Он родом из 80-х и понятия не имеет о тональном наборе и GPS... но если ему в руки дать любое из этих устройств, он сможет набрать номер и сделать звонок. Почему? Потому, что он умеет использовать метод набратьНомер(), и большего ему знать не нужно.

    А теперь представьте другого пользователя, нашего современника. Он вырос в эпоху смартфонов... но если ему в руки дать старый телефонный аппарат, он тоже сможет сделать звонок, т.к., опять же, знает метод набратьНомер().

    Применительно к ООП, пользователь - это переменная, содержащая ссылку на экземпляр класса. Ее тип (как она была объявлена) - это "набор знаний" о возможностях этого экземпляра. И т.к. Смартфон в своей основе является Телефон-ом, мы вполне можем дать его в руки гипотетическому пользователю из 80-х:
    Телефон устройство = new Смартфон();
    в результате чего он сможет сделать звонок:
    устройство.набратьНомер("03");
    А вот определить свое местоположение он не сможет, пока не узнает о существовании соотв. метода:
    Смартфон усовершенствованноеУстройство = (Смартфон)устройство;

    Это называется приведением типа. В данном примере у экземпляра класса уже был соотв. метод, но чтоб им воспользоваться, нужно сначала явно указать, что мы хотим рассматривать имеющееся у нас в руках устройство не как "простой" Телефон, а как Смартфон.

    P.S. Кстати, в этом примере мы затронули не только полиморфизм, но и наследование, и инкапсуляцию (пользователя "снаружи" совершенно не интересует, как именно производится набор номера - тонально, импульсно или еще как-то иначе)... так сказать, все три кита ООП в одном флаконе. И только так вообще имеет смысл рассматривать эти принципы, т.к. они по сути неотделимы друг от друга, как Отец, Сын и Святой Дух в Христианстве или же длина, ширина и высота в трехмерном пространстве :) Если это понять, ООП становится совершенно простой и естественной парадигмой программирования.
    Ответ написан
    8 комментариев
  • Как ускорить алгоритм?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Я так понял вы просто перебираете все возможные варианты (питона я, увы, не знаю). Составте систему уравнений и сделайте ее решение в общем виде и туда уже подставляйте исходные данные. Это будет быстрее.

    Ну и, если что, кординаты точек будут правильнее выглядеть вот так: А(х1, y1) и В(x2, у2).

    Кроме того у вас в задании ошибка. Я правильно понимаю, что x1, x2, y1, y2 - должны быть целыми числами (в противном случае задача имеет бесконечно большое колличество решений).
    Ответ написан
    1 комментарий
  • Как скопировать файлы рекурсивно без сохранения структуры каталогов (Debian)?

    BuriK666
    @BuriK666
    Компьютерный псих
    find /path/to/files -type f -exec cp {} ./ \;
    Ответ написан
    Комментировать
  • Почему приложение x64 в два раза медленнее x86?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Отвечать на этот вопрос без какой-либо дополнительной информации - это как гадать на кофейной гуще. Какой CPU - если это древний Pentium D с допотопным конвейером и глупыми регистрами - одно дело, а если это новейший Core i7 на Haswell - другое. Что до настроек - вот честно, "стандартные" вообще ни о чём не говорит. Я уже не говорю, что было бы не плохо указать количество опытов с максимальным и минимальным - вполне возможно глупые ОС с планировщиком как-то неудачно распределяют время. Любой ответ, который можно тут указать может быть техническим грамотным, но совершенно не соответствующий истине.

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

    Теперь давайте вместе подумаем о том, какие различия между x86-64 и x86. На самом деле, вопрос поставлен не очень корректно - x86-64 почти полностью включает в себя x86. Из изменённого - размер указателя (адреса), да немного переделана логика регистров (хотя все они на месте, просто добавилось ещё лишние несколько десятков) - теперь часть аргументов в функцию передаётся через дополнительные регистры, тогда как в x86 все идут через стек. Однако получить здесь преимущество не так уж и просто - процессор тоже не дурак, в случае линейной обработки информации (или любая длительная работа с небольшими участками памяти) он прекрасно всё кэширует и работа со стеком в общем случае не сильно медленнее работы с регистрами.

    Теперь смотрим на код. Что там? Куча адресной арифметики, немного функций, да и аргументов почти нет. 8 миллионов слов? Не думаю что рекурсия вынудит вылезти стеку за пределы кэша, так что есть подозрение о паритете архитектур в данном случае. Однако большое количество адресной арифметики и увеличенный размер адреса в битах... во сколько раз? В два раза?

    Ну да ладно, ясное дело, сложение реализовано за 1 такт. Скорее всего. Конечно, здесь вопрос процессора, но даже узнав модель будет сложно узнать наверняка, разве только синтетическим тестом (много раз обращаться по адресу - сумме двух случайных чисел). Да и Windows 8.1 никогда не был стандартом производительности (скорее с точностью наоборот), и VC++ никогда не был лучшим компилятором.

    Попробуйте gcc (меня разве только интересует откуда на Windows взялся gcc) с флагом -O3. И посмотрите машинный код для 64 бита и 32 бита (можно пользоваться objdump из binutils или посмотреть машинный код в IDE Visual Studio - точно расположение кнопки не помню, но можно поискать в менюшках). Скорее всего причина не одна, их множество. Так, вызов функции сопровождается сохранением контекста, тогда как в x64 регистров больше, больше и контекст. Собираем такие моменты по крупицам... Вот и получаем.

    P.S. Давным давно, разговаривал с преподавателем. Простая перекомпиляция под 64 бита ускорила код на 30%. Это был колхозный кодек, немного похожий на libx264 (от туда была сдёрнута часть кода). Естественно, проект собирался со всеми оптимизациями, со всем расширениями инструкций - со всем, чем можно. И сборка под платформу x86-64 (с SSE, MMX, FMA и прочие). Жутко наукоёмкий разношёрстный код (писали все - от зелёных аспирантов, до ровесников Страуструпа и профессоров университета) - туева хуча функций, структур, объединений и очень, очень много параметров, многие из которых передают в аргументы функций. Ну и целевая платформа - жутко порезанный и переделанный Windows Embedded - там просто не чего было планировать.
    Ответ написан
    Комментировать
  • По какой причине не используются числовые хеши?

    Spetros
    @Spetros
    IT-шник
    Для представления хеш-сумм принято использовать шестнадцатеричную систему счисления.
    Она более удобна и компактна, по сравнению с десятичной.
    Ответ написан
    1 комментарий
  • Ошибка синтаксиса Python. Почему питоша ругается?

    @balamut108
    Py
    Экранируйте кавычки.
    Ответ написан
    Комментировать
  • Как хранить большое количество элементов в массиве?

    @endemic
    Если я не ошибаюсь, в качестве индекса массива используется size_t, который соответствует максимальному размеру памяти для процессора с даннйо битностью. То есть описанная вами ситуация не может произойти в принуципе.

    ru.cppreference.com/w/cpp/types/size_t
    Ответ написан
    Комментировать
  • Как создать сктеч для arduino из нескольких файлов?

    LittleFatNinja
    @LittleFatNinja
    горе девелопер, любитель лютой садомии
    так же как и обычный код на С
    Ответ написан
    5 комментариев
  • Почему digitalRead рандомно возвращает HIGH?

    Используйте стягивающие/подтягивающие резисторы, что бы не ловить помехи.

    стягивающий:
    %D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%
    Есть нажатие: Vout = Vcc
    Нет нажатия: Vout = 0

    подтягивающие:
    %D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%
    Есть нажатие: Vout = 0
    Нет нажатия: Vout = Vcc
    Ответ написан
    Комментировать
  • Почему digitalRead рандомно возвращает HIGH?

    @AlexanderKomarchouk
    программист PHP, embedded atmega/stm32
    В Atmega порт очень чувствительный, и принимает помехи на линии за изменение логического сигнала на входе.
    Что бы избежать этого, можно между входом и + питания подключить резистор, например, 10 кОм, т.е. "подтянуть к питанию", либо использовать "встроенные" в микроконтроллер программируемые "подтягивающие" резисторы.
    Для этого нужно написать:
    void setup()
    {
      pinMode(switchPin, INPUT_PULLUP);
    }
    Ответ написан
    1 комментарий