• Как поменять порядок битов в байте C?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Вручную, наивно. Представьте, что это массив из 8 значений. У вас есть операции "прочитать i-ое значение" ((x >> i) & 1) и "записать значение a в позицию i" ((x & ~(1 << i)) | (a << i)). Дальше остается написать цикл и руками менять биты местами.

    Дальше, конечно, можно извращаться с оптимизацией и всякмими битовыми хитростями.

    Но если вам важна именно скорость, то быстрее предподсчета (как вам угодно) и хранения результата в таблице вы ничего не сделаете.
    Ответ написан
    1 комментарий
  • Почему отладка работает в конфигурации release в Visual Stuido?

    @d-stream
    Готовые решения - не подаю, но...
    А VS использует отдельный отладочный файл .pdb
    Но есть нюансы - после оптимизации бинарный код может оказаться слегка "отличающимся" от исходника и попытки прошагать иногда могут перескакивать через строки и аналогично не везде встанет точка останова (точнее в неё выполнение не прилетит)
    Ответ написан
    1 комментарий
  • Как Java программисту подшутить над C++ программистом?

    afiskon
    @afiskon
    - Зачем C++ программист перешел на другую сторону улицы?
    - Зачем?
    - Чтобы собрать мусор! АААААХАХАХХА!

    - Тук-тук. C++ ПРОГРАММИСТ!
    - Кто там?

    Ну и далее по шаблонам....
    Ответ написан
    4 комментария
  • Почему программы получают доступ к планировщику задач, регистру, автозапуску и службам?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что им можно. Либо ты из под админа их запускаешь, либо вообще контроль учётных записей выключен.
    Ответ написан
    1 комментарий
  • Почему программы получают доступ к планировщику задач, регистру, автозапуску и службам?

    @res2001
    Developer, ex-admin
    Смотря какой доступ. Смотря из-под какой учетной записи запущена программа.
    Доступ к планировщику задач есть у всех, пользователь может создавать новые задачи, удалять старые и т.п.; доступ к реестру к пользовательской ветке есть у пользователя полный, к ветке HKLM - на чтение, к некоторым разделам доступ ограничен; автозапуск - это просто ветки реестра и каталог "Strtup" в меню пользователя, соответственно права доступа зависят от нахождения ветки/каталога - если это пользовательский реестр или меню, то доступ полный, если системный - на чтение; доступ к службам у обычного пользователя на чтение есть, на запись требуются админские права.
    Если есть доступ у пользователя, то есть доступ и у любых программ, запущенных под этим пользователем.
    Ответ написан
    Комментировать
  • Что содержит в себе буфер обмена .html странички?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    При копирование любой части страницы будет HTML Format.
    Ответ написан
    1 комментарий
  • Что означает синтакс const char *format [, argument]... в документации?

    @res2001
    Developer, ex-admin
    Функция с переменным числом аргументов, но минимально должен присутствовать 1 - format, все остальные опционально.
    Ответ написан
    1 комментарий
  • Что означает синтакс const char *format [, argument]... в документации?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Квадратные скобки - это, в данном случае, обозначение необязательного параметра. Три точки - указание на то, что параметр может повторяться. То есть, допустимые варианты:
    int scanf ( const char * format );
    int scanf ( const char * format, argument );
    int scanf ( const char * format, argument1, argument2 );
    и т.д.
    Ответ написан
    1 комментарий
  • Как конструктор std::ofstream преобразует std::string в char const * filename?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Никак. Смотрите на (2).
    Ответ написан
    2 комментария
  • Что лучше window.write(object) или object.write(window)?

    @Mercury13
    Программист на «си с крестами» и не только
    Да, относится — к MVC.
    В большинстве случаев лучше window.write(object).
    Внутренние структуры данных не должны зависеть от интерфейса, а интерфейс — может зависеть от внутренних структур данных.
    Если интерфейс сложный, могут быть какие-то промежуточные околоинтерфейсные объекты — например, чтобы изолировать или повторно использовать какую-нибудь логику. И вот в этих-то околоинтерфейсных структурах, каком-нибудь ComboBuilder, может быть writeTo(comboBox).

    Кроме того, в вебе, которому привычно видеть картину в момент T, а не в динамике, MVC если и есть, то сильно модифицированный.
    Ответ написан
    3 комментария
  • Как работает выделение памяти 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. Сколько байт реально было выделено зависит от реализации.

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


    Да. Использовать эту память согласно стандарту нельзя.
    Ответ написан
    Комментировать
  • Как убрать залипание клавиш graphics.h?

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

    Вам надо избавиться от getch и вместо этого опрашивать систему, а не зажата ли какая-то клавиша.

    Способы сделать это платформозависимы. Например, в винде можно воспользоваться GetKeyState.
    Ответ написан
    1 комментарий
  • Почему создание временного объекта c помощью конструктора копирования оценивается как redeclaration?

    Nipheris
    @Nipheris Куратор тега C++
    А с чего вы решили, что парсер это разобрал как конструкцию вызова конструктора копирвания? Я думаю он считает это декларацией. Вот если Object { o1 }; напишите, то другое дело.
    Ответ написан
    4 комментария
  • Как работает определение дружественной функции внутри класса?

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

    Дружественность к перегрузке операторов не имеет никакого отношения. Перегрузка оператора в виде внешней функции и добавление дружественности для этой перегрузки выглядит как признак незнания стандарта в плане перегрузки операторов. Потому что в этом случае перегрузку нужно проводить в виде метода.
    Исключением являться может только определение перегрузки оператора по месту объявления дружественности. Я уже объяснял почему это может быть удобно.
    Такая перегрузка становится только ADL-доступной и не может быть вызвана через полную квалификацию имени.

    Как я понимаю, эта техника позволяет писать перегрузку оператора внутри класса, как будто это член класса, а не глобальная бинарная дружественная функция.

    Это не так. У тебя неверное понимание. Наверное ты уже подзабыл мое прошлое объяснение по этому вопросу. Я рекомендую повторно обратиться к тому вопросу и ответу.
    friend std::ostream& operator<<(std::ostream& os, const Object & r) {/**/ return os;}

    Тут operator << все так же остается глобальной функцией, определенной в том же пространстве имен, где определен и тип Object, но не в пространстве имен типа Object. Но, будучи определенным по месту объявления дружественности, оператор стал только ADL-доступным. Обращение к этому оператору может быть найдено только тогда, когда в конструкции std::cout << obj; этот obj имеет тип Object.

    Но почему такая же логика не работает с обычной функцией?

    Минимально, потому что операторы никак нельзя сравнивать ни с глобальными функциями, ни с методами. У операторов своя отдельная методика вызова, отличная от функций.
    friend void fOUT (void) { }, опять же, является определением по месту объявления дружественности и доступна только через ADL. Но у нее нет аргументов чтобы ADL смог найти ее при обращении. Поэтому такая конструкция является бесполезной.
    Ответ написан
    Комментировать
  • Почему дружественная функция, определённая внутри класса с первым параметром встроенного типа, недоступна вне определения класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы пытаетесь вызвать f1 и т.д., как будто это члены класса A. Но подумайте, какой смысл объявлять члены класса friend? Зачем вообще дружественность нужна? Чтобы иметь доступ к приватным членам класса, но ведь члены класса и так имеют туда доступ. Это бесмыссленная операция.

    Но так уж стандарт сделан, что вместо ошибки компиляции, определенные через friend функции становятся глобальными.

    По идее вы в классе должны их только объявлять (сигнатура без тела), а определение (тело функции) должно быть уже снаружи где-то, как вы с f1 сделали.

    Почему f5 не находится? Попробуйте передать туда, допустим a. Компилятор, внезапно, найдет функцию и ругнется, что не может преобразовать A к int. Но если передать туда int, то компилятор функцию потеряет.

    Тут хитрая магия описанная в стандарте - всякие нагромождения правил посика имен.
    В стандарте сказано, что вот при определении friend функций:
    A name first declared in a friend declaration within a class or class template X becomes a member of the innermost enclosing namespace of X, but is not visible for lookup (except argument-dependent lookup that considers X) unless a matching declaration at the namespace scope is provided - see namespaces for details.


    Я не знаю, как это внятно объяснить, вот просто не работает и все. Стандарт такой. С остальными функциями срабатывает, потому что там в аргументах есть A, поэтому объявления в классе каким-то образом попадают в область поиска имен.

    Просто не надо определять функции-друзей в классе. Это не имеет смысла. Или делайте там статичные функции, или определяйте всю функцию во внешнем пространстве имен а в классе указывайте, что она имеет доступ ко всему классу.
    Ответ написан
    1 комментарий
  • Почему дружественная функция, определённая внутри класса с первым параметром встроенного типа, недоступна вне определения класса?

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

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

    Функция f5 не просто первично объявлена, она и определена по месту объявления дружественности. Ее имя является однозначно неквалифицированным в следствии своего определения.

    Еще из стандарта мы можем узнать о том, что первично объявленное дружественное имя не может быть найдено средствами стандартного поиска квалифицированных или неквалифицированных имен.
    Именно этот результат мы и можем наблюдать в вопросе. Имя f5 не находится.

    Все потому что т.н. имена скрытых друзей могут быть найдены только средствами ADL.
    Если коротко, Argument-Dependent Lookup опирается на типы аргументов при вызове функции, пространства их имен и пространства имен, в которых эти типы объявлены.
    ADL не выполняет поиск в пространствах имен в отношении фундаментальных типов. Поэтому код f5(5); буквально обречен на ошибку трансляции.

    Первично объявленная дружественной функция будет исключительно ADL-доступной до момента своего объявления или определения в том же пространстве имен, в котором определен тип друга. В этом случае функция станет доступна для поиска квалифицированных или неквалифицированных имен.
    Для f5 доступен только способ с повторным объявлением, т.к. она уже определена.
    Да только в этом случае f5 окончательно потеряет всякий смысл быть дружественной для A и станет просто сильно спрятанной и сбивающей с толку глобальной функцией.
    Суть дружественности в раскрытии доступа, которым f5 относительно A не пользуется, т.к. среди ее параметров нет ни одного с типом A.

    В результате.
    Чтобы ADL нашел функцию f5, среди ее параметров обязан быть параметр и с типом A.
    Чтобы UNL или QNL смогли найти функцию f5, ее надо дополнительно объявить за пределами типа A в его пространстве имен.
    Ответ написан
    1 комментарий
  • Почему телефон HTC определяется как портативное устройство вместо съёмного диска?

    Bringoff
    @Bringoff
    Android dev at Freelance
    Desire 600, насколько я понимаю, работает с протоколом mtp. Как и большинство устройств на 4.0+, Сейчас устройств, подключаюшихся как съёмный диск, по сути, нет.
    Для восстановления данных есть другие, специальные, способы.
    Ответ написан
    Комментировать
  • Почему телефон HTC определяется как портативное устройство вместо съёмного диска?

    Судя по всему, второй использует для обмена данными с ПК протокол MTP.
    Ответ написан
    Комментировать
  • Зачем компилятор повторно инициализирует объект?

    15432
    @15432
    Системный программист ^_^
    Из-за присваивания. Чтобы присвоить объекту типа B объект типа A, нужно создать промежуточный объект типа B конструктором (A::B::B (A &)). И только потом присвоить (A::B::B (B const &)). И удалить временный объект. Так думает компилятор
    Ответ написан
    1 комментарий