• Зачем прописывать методы в Interface когда можно так же в классе?

    @Mercury13
    Программист на «си с крестами» и не только
    Ответ явоспецифичный. Потому что один класс может реализовать сколько угодно интерфейсов, но наследуется лишь от одного класса.

    Ответ концептуальный. Ромбическое наследование. От А наследуются B и C, от них обоих наследуется D.
    1) Если в A есть поле, в D что, это поле будет в двух экземплярах? А если оно protected и в B мы добавили метод, который его меняет?
    2) Если B и C переопределяют какой-то метод foo(), как быть D? А если нужна и версия B.foo(), и C.foo(), и они обе вызывают A.foo — получатеся D.foo вызовет A.foo дважды? А если в C есть второй метод bar(), который вызывает foo() и начинает вести себя не так, как надо, если мы берём реализацию B.foo()?
    В общем, множественное наследование — хорошая штука, но ромбическое — штука опасная. В языке, где любое множественное наследование неизменно ромбическое, всё, что остаётся — делать такие условия, при которых ни 1, ни 2 не сработает.
    Одно из таких условий — унаследоваться от одного класса и нескольких интерфейсов. 1) У интерфейса нет полей, и 2) эталонная реализация, существующая в некоторых языках программирования, в любом случае менее приоритетна, чем конкретная реализация из класса. Вызывать ту и другую нет смысла: если программист написал свою сверх эталонной — значит, он хочет сделать то же другим путём.
    Ответ написан
    Комментировать
  • Какое время жизни объекта в std::unique_ptr?

    @Mercury13
    Программист на «си с крестами» и не только
    Уничтоженный unique_ptr уничтожит ваш объект.

    «Уничтожит» — это значит, вызовет деструктор и сделает память доступной менеджеру памяти. Теперь другие указатели, которые смотрят на этот объект, будут «висячими», и при их разыменовании программа может сделать ЧТО УГОДНО.

    А теперь посмотрим, что именно ей угодно. Ваша функция foo() невиртуальная и не имеет дела с полями, ей нужен только this (указатель на объект), который даже не разыменовывается. Она в принципе не может вылететь, даже если десять раз занулить этот объект!

    То, что вы хотите сделать — это семантика std::shared_ptr/weak_ptr.
    std::shared_ptr<ttt> sh1 = std::make_shared<ttt>();
    std::weak_ptr<ttt> we = sh1;
    {
      std::shared_ptr<ttt> sh2 = sh1;
      sh1 = nullptr;
    }
    std::cout << we.expired();  // должно быть true


    UPD. Вот для таких, как ты, и ввели в C++14 функцию std::make_unique, по аналогии с std::make_shared. Просто чтобы было меньше таких ошибок.
    Ответ написан
    Комментировать
  • Как заполнить двумерный массив?

    @Mercury13
    Программист на «си с крестами» и не только
    var // ну или const
    masMask: array[1..3, 1..3] of string = (
      ( '11', '12', '13' ), ( '21', '22', '23' ), ( '31', '32', '33' )
    );

    ВНИМАНИЕ! Я не проверял, как оно работает, когда это локальная переменная (var).

    UPD. Проверил, нельзя. Var работает только если массив глобальный. Const, разумеется, работает всегда, ибо создаёт глобальный массив и запрещает туда писать. Если же нужно инициализировать локальный var, надо объявить тип
    type TSomeTable = array[1..3, 1..3] of string;
    создать какую-то константу
    const masStart: TSomeTable = …;
    var masMask : TSomeTable;

    а затем в начале masMask := masStart;

    UPD2. Для чего объявить тип? Читайте правила эквивалентности типов в Паскале, они жёстче, чем в Си. И тот учебник, по которому я учил Паскаль (Зуев), особо упоминает, что два одинаковых array не эквивалентны.

    UPD3.
    months = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec);
     — это не массив! Это перечисляемый тип. Кстати, из-за правил пересечения идентификаторов очень не советую писать типы и перечисляемые константы без венгерской записи, к тому же название months сбивает с толку. Лучше будет TMonth = (monJan, monFeb, …);.
    Ответ написан
    Комментировать
  • Как применяется закон Бенфорда для второй цифры?

    @Mercury13
    Программист на «си с крестами» и не только
    Распределение второй цифры неравномерное, но малозаметное на практике. Например, для нуля будет.
    p0 = (lg 11 − lg 10) + (lg 21 − lg 20) + … + (lg 91 − lg 90)
    Ответ написан
    Комментировать
  • Где найти новые детерминированные игры с полной информацией?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть разумеется.
    18 век: https://en.wikipedia.org/wiki/Agon_(game)
    19 век: https://ru.wikipedia.org/wiki/Реверси
    20 век: https://ru.wikipedia.org/wiki/Перебрось_мостик
    20 век: https://ru.wikipedia.org/wiki/Гекс
    20 век: https://en.wikipedia.org/wiki/Quoridor
    21 век: https://ru.wikipedia.org/wiki/Улей_(игра)
    21 век: https://ru.wikipedia.org/wiki/Khet

    Почему таких игр крайне мало?
    1. Мы автоматически отбрасываем часть позиций как неперспективные — потому, чтобы обеспечить ту же просчитываемость, ДИсПИ должна быть намного богаче тайной или случайной. Некоторые механики придётся отбросить, поскольку, например, заимствованием стратегии доказывается, что первый выигрывает.
    2. Из двух игроков разной силы один выигрывает с вероятностью, стремящейся к 100%, игра быстро теряет интерес. А ведь как важен такой интерес для новой игры, которая пока продвигается…
    3. Продвигается исключительно гиками: сложно сыграть, например, папе с дочкой.
    UPD. 4. Крайне сложно сделать, чтобы компьютер косплеил человека. Другими словами, совершал ошибки, свойственные человеку, и при попытках подловить тупой алгоритм ходил как угодно, лишь бы по-другому.

    А насчёт шахмат — от первых упоминаний до современных правил прошло тысячелетие! Догадываетесь, какие плейтесты они прошли, чтобы из банального варгейма стать тем, чем они являются сейчас (хотя тоже, по всей видимости, были популярны в первую очередь у верхушки общества).
    Ответ написан
    5 комментариев
  • Разделение строки из символом в массив?

    @Mercury13
    Программист на «си с крестами» и не только
    // считать строчку
    std::string s;
    std::getline(std::cin, s);
    // …и разбираем её потихоньку через поток-строку
    std::istringstream is(s);
    int i;
    std::vector<int> v;
    while (is >> i)
      v.push_back(i);
    Ответ написан
    Комментировать
  • Как выделяется память в классах?

    @Mercury13
    Программист на «си с крестами» и не только
    Examp ex = new Examp ();
    Неверный код, надо Examp* ex = new Examp;

    В случае статического определения (Examp ex2;) — в той памяти, где обычно располагаются объекты. То есть:
    • Если это поле объекта — то в теле объекта, которое может быть где угодно (куча, сегмент данных, стек).
    • Если static/глобальный — то в сегменте данных.
    • Если локальный — в стеке. Конкретно тут локальная переменная, и она будет в стеке.

    В случае динамического определения (Examp* ex = new Examp;) — в «куче».
    В этом примере, кроме операции new, которая заводит объект в куче, видим ещё и указатель, который располагается «там, где обычно» — в теле объекта, сегменте данных или стеке.
    Ответ написан
    Комментировать
  • Bit shift (swap bytes) как это в действительности работает?

    @Mercury13
    Программист на «си с крестами» и не только
    Банально сначала надо unsigned value = 0;
    Вы вроде делаете полный порядок, но начальное присваивание неверное.

    UPD. Проверил в деле — так и есть.
    Ответ написан
    1 комментарий
  • Как проверить существует ли указатель или был удален?

    @Mercury13
    Программист на «си с крестами» и не только
    В Си++11 для этого есть два класса: std::shared_ptr и std::weak_ptr.

    Первый служит для того, чтобы несколько указателей «смотрели» на один объект, и при исчезновении ВСЕХ объект автоматически исчезал.

    Второй «смотрит» на тот же объект, что управляется shared_ptr’ами, но не мешает объекту удаляться. Его можно преобразовать в shared_ptr и тогда уж посмотреть, исчез объект или нет.

    UPD. Вы делаете свой shared_ptr. Тогда, если shared_ptr не NULL — значит, считаем, что объект действительно там есть! А если кто-то удалил своими силами — значит либо shared_ptr глючный, либо кто-то удалил объект в объод семантики умных указателей.

    Кроме того, код по ссылке странный. if (ref_count == 0) — это мы сравниваем указатель с NULL! Написано «переписываем оператор равенства» — по факту переписываем операцию присваивания…
    Ответ написан
    9 комментариев
  • Существует ли одноричная система счисления?

    @Mercury13
    Программист на «си с крестами» и не только
    Двоичная система счисления — это т.н. позиционная система счисления с постоянным основанием.

    Существуют и другие, как-то унарная, фибоначчиева, римские цифры…
    Ответ написан
    Комментировать
  • Как правильно сделать таблицы?

    @Mercury13
    Программист на «си с крестами» и не только
    Поскольку комментарий принадлежит одному пользователю и только ему, у нас соотношение 1:∞, и не нужна таблица-связка, предназначенная для соответствия ∞:∞.
    Только второе.
    Ответ написан
    Комментировать
  • Почему не работает (с++)?

    @Mercury13
    Программист на «си с крестами» и не только
    Надо long long n;
    Дело в банальном переполнении, но profesor08 дал явно неверный ответ.
    Ответ написан
    1 комментарий
  • Что не даёт на C++ писать кроссплатформенные приложения?

    @Mercury13
    Программист на «си с крестами» и не только
    Си — язык очень близкий к железу. Когда мы пишем на Java, мы пишем код под Java-машину. На Си мы пишем код под процессор. Главная проблема, связанная с любыми подобными языками,— отсутствие понимания целевых ОС программистами и тестирования — тестерами. Это нужно, ибо абстрагирование от машины очень тонкое.

    Поскольку перед нами очень тонкая прослойка, абстрагирующая от машины, приходится принимать меры, чтобы код переносился с машины на машину (даже с x86 на x64). Отлично это описано в блоге PVS-Studio.

    В Windows и Linux машина-то одна и та же, но конкретно в Си++ к этому добавляется устаревшая по некоторым вещам стандартная библиотека. Примеры…
    • Поддержка юникодных имён файлов пока не кроссплатформенная.
    • Унаследоваться от std::ostream — ужос такой ещё.
    • Как сконвертировать текст в UTF-8? Загугли и посмотри, какой там вавилон из шаблонов.
    Отсюда огромное количество производителезависимых расширений, чужих библиотек, повторяющих стандартную, и прочее. Важный пункт тут: чужих библиотек, повторяющих стандартную. Если у тебя строки нестандартные и файлы нестандартные — какая тут кроссплатформенность?
    Ответ написан
    Комментировать
  • Какие современные, средства(системы, программы) могут осуществлять: Точный, адаптивный и художественный переводы?

    @Mercury13
    Программист на «си с крестами» и не только
    Разрешите мне привести одну интересную цитату 1987 года. Принадлежит она компьютерному лингвисту Журавлёву.

    Что ж, разберемся повнимательнее. Не так давно появились было в языке и быстро исчезли два слова «искож» и «кожимит». Первое означало «искусственная кожа», а второе — «имитация кожи». Слово «искож» в речи вообще не прижилось, тогда как кожимит существовало довольно долго (пока химия не завалила нас таким разнообразием «кожимитов», что им нет ни числа, ни названий). Думаю, победу кожимита в соревновании с искожей (или искожем?) обеспечило не только лучшее устройство морфологической формы <…> Видимо, чувствовалась и более высокая семантическая точность слова кожимит. Вот если бы человек своим искусством создал материал, который можно было бы приживить на место поврежденной естественной кожи, и этот материал функционировал бы так же, вот это была бы действительно искусственная кожа. <…> А раз этого нет, то это — кожимит.

    Слова «имитация» и «искусственный» не всегда так строго различаются в нашей речи. Может быть, потому, что время всего искусственного и имитации всего, чего угодно, только еще начинается и мы еще недостаточно основательно разобрались в сложностях и тонкостях этого процесса? Говорят «искусственный мрамор» и «имитация мрамора», «искусственный дождь» и «имитация дождя». Это примерно одно и то же. Но вот вместо «искусственное орошение» нельзя сказать «имитация орошения». Получится, что никакого орошения нет, а создается только его видимость. То же самое «искусственный отбор» или «искусственный спутник». Так что имитация — это скорее подделка, видимость, обман. Имитируется лишь внешняя сторона явления, его сути имитация не отражает. Например, имитация бурной деятельности. Как видим, язык постепенно все четче разграничивает понятия искусственности и имитации.

    Такое же разграничение стремится провести и автор между понятиями искусственный интеллект (искинт) и имитация интеллекта (интимит), считая, что искинт — название принципиально неверное и что есть смысл говорить лишь об имитинте.

    В чём тут дело? Подобный интеллектуальный инструмент должен быть, как ни странно, предсказуем («страж-птица» у подобных искусственных интеллектов будет раз из миллиона, чаще будет фигня всякая наподобие «взбесился, начал громить всё вокруг — и получил разряд тока»). И потому пусть он ошибается, но не пытается познавать мир через своё ограниченное окно. Пусть познаёт только переводческие шаблоны.

    А художественный переводчик вообще занимается разовыми по-настоящему интеллектуальными задачами — то есть творит новое. Его не заменит ни один автомат. Допустим, Нора Галь открыла офигительный нюанс художественного перевода: перевод пола персонажа, чтобы его имя соответствовало гендерной роли. Читаем её «Слово живое и мёртвое».

    В начале «Письма заложнику» Сент-Экзюпери есть образ: Лиссабон как мать — слабая, беззащитная, она верой в призрачное счастье пытается отвести от сына беду.

    По-французски Лиссабон женского рода. Но по-русски... Не может же переводчик переименовать город, даже если это ему нужно позарез! И молодой переводчик в первой журнальной публикации выхода не нашел. Напечатано было так: «Лиссабон улыбался несколько вымученной улыбкой; так улыбаются матери, не получающие известий с фронта от сына и пытающиеся спасти его своей верой: "Мой сын жив, раз я улыбаюсь..." "Посмотрите, как я счастлив и спокоен, – говорил Лиссабон, – и хорошо освещен..." ...праздничный Лиссабон бросал вызов Европе: "Можно ли делать меня мишенью... Ведь я так беззащитен! ..."»

    И образ пропал, он не убеждает. Ну, а как быть? Оказалось, вывернуться все-таки можно: «И столица улыбалась через силу... Столица Португалии словно говорила: "Смотрите, я так безмятежна, я такая мирная и светлая... Разве можно на меня напасть... я так беззащитна! "» Столица есть поблизости и в оригинале — и вот там по-русски без малейшего ущерба можно сказать Лиссабон.

    Трудней было «выкрутиться» в «Маленьком принце». Вот появился прекрасный цветок, его нрав и поведение явно женские. По-французски la fleur женского рода. Мужской род здесь, хоть убейте, невозможен! Но поначалу нельзя прямо назвать цветок розой, принц этого еще не знает. И снова выручила замена: неведомая гостья, красавица. В таких случаях необходимо как-то схитрить, извернуться, чтобы сохранить главное.
    Ответ написан
    Комментировать
  • Наследование оператора присваивания (=), как это сделать?

    @Mercury13
    Программист на «си с крестами» и не только
    Почему не прописывается автоматически? А потому что в Test2 будет больше полей, и никто, кроме вас, программиста, не знает, что с ними делать.

    Но никто не мешает самому написать операцию =, например.
    class Test2 : public Test
    {
    private:
      typedef Test Super;
    public:
      Test2& operator = (const Test& x);
    };
    
    Test2& Test2::operator = (const Test& x)
    {
      Super::operator = (x);
      // придумай, что сделать с недостающими полями
      return *this;
    }
    Ответ написан
    3 комментария
  • В чем суть WinApi?

    @Mercury13
    Программист на «си с крестами» и не только
    Windows API — это самый низкоуровневый интерфейс Windows, доступный прикладному программисту — в том плане, что он на долгосрочной поддержке и не изменится с Windows 11.

    Поверх Windows API работают все BOOST и STL.

    Пример: читать файл в 130 мегабайт по одному байту. Добавив асинхронного чтения через OVERLAPPED, я сумел это сделать менее чем за 2 секунды (это был поток общего назначения с виртуальными read(), write() и seek(); специализированный прикладной буфер даст ещё выигрыша, но и это хорошо). То же самое через FILE* — не дождался.

    Пример второй, всё те же файлы. Дело в том, что Excel захватывает свои файлы на всё время, пока он открыт. Закрывать? — плохой выбор. Добавив один флажок в CreateFile, документы всё-таки стало возможным открывать при работающем Excel.
    Ответ написан
    2 комментария
  • Как передать вектор в функцию?

    @Mercury13
    Программист на «си с крестами» и не только
    Раз мы изменяем наш вектор — то по неконстантной сцылке.

    void add (int n, std::vector<int>& vec){
        vec.push_back(n);
    }
    
    std::vector <int> myVec;
    add(5, myVec);
    Ответ написан
    Комментировать
  • Можно ли воскресить спикер на 10-ой винде?

    @Mercury13
    Программист на «си с крестами» и не только
    https://blogs.msdn.microsoft.com/larryosterman/201...
    К сожалению, нельзя, это связано с серверами и ноутбуками. У серверов нет динамика, у ноутбуков динамик — отдельный вход звуковой, и приходилось держать эту звуковую постоянно включённой.
    Ответ написан
    Комментировать
  • Какие есть библиотеки для работы с RAW изображениями?

    @Mercury13
    Программист на «си с крестами» и не только
    1. RAW есть несколько штук: RAW CHDK, CRW Canon, NEF Nikon, платформонезависимый, но мало кем используемый DNG…
    2. Если у вас графической редактор общего назначения, крайне не советую. Для «проявки» RAW нужен особый инструментарий, которого в редакторе общего назначения нет. Плюс куча очень умных вещей, вроде дебайеризатора и шумодава. Оставьте это лайтрумам!
    XnView, допустим, смотрит, но получается дрянь — в CHDK RAW все эти дебайеризации и кривые яркости сделаны как попало, и шумодава никакого. Хотя формат, признаться, редкий, Adobe его берёт только через промежуточный платформонезависимый DNG.
    В Nikon NEF, по-видимому, смотрит превьюху: нет никакой разницы с Medium JPEG — любая программа проявки хоть где-то да проявит свой характер. Впрочем, одна есть: адовы искажения, присущие пережатому JPEG. К тому же снял в ч/б — он и вывел ч/б, в отличие от DxO, которому надо ещё указать, что формат с матрицы надо ещё в ч/б конвертнуть.
    (Других фотоаппаратов у меня не было.)
    Но XnView — просмотрщик, ему позволительно, он должен поддерживать как можно больше форматов и показывать их, пускай как попало.
    Фотошоп открывает, но там этот инструментарий в каком-то виде есть, и под капотом нечто очень умное, на голову превосходящее внутрикамерную проявку мыльниц Canon (зеркалку Nikon не проверял). Но и они собрали все свои наработки по RAW и сделали отдельную программу специально для проявки цифрофото — Lightroom.
    3. Обратно в RAW в принципе не стоит. Это файл с матрицы фотоаппарата, и точка. Вы что, хотите снимки подделывать?

    UPD. Ясно, вы решили именно проявлять несколько кадров в один HDR…
    Тогда задача библиотеки — дебайеризовать, возможно, подавить шум, И ВСЁ. Вам нужны картинки в ЛИНЕЙНОМ цветовом пространстве с 16-ю битами на канал. Обычная проявка в JPEG (BMP, TIFF) НЕ КАТИТ, у них по умолчанию ГАММА-СКОРРЕКТИРОВАННОЕ пространство и единица около нуля не равна единице около 255. Скажем так: на экране, чтобы выделялось на чёрном фоне, надо осветлять почти на 60 единиц, на белом — затемнять на 16.

    Остальную магию вы уж как-то сами проведите. 1) Подправьте искажения объектива (как геометрические, так и цветовые). 2) Склейте три кадра в один с дробным цветовым пространством. 3) Придумайте, как всё это чудо свести в узкий диапазон экрана. 4) Наладить все эти гамма-коррекции и прочие кривые. 4) И только тогда преобразовать в целое [0…255].
    Ответ написан
    2 комментария
  • Если я делаю reskin приложения или же использую скаченные скрипты для своей игры не мною написанные то что за это может быть в google play?

    @Mercury13
    Программист на «си с крестами» и не только
    Перескиновка — это явное нарушение копирайта, будут санкции, если кто-то обратится.

    Скрипты — скорее всего, ничего не будет, хотя читайте лицензию на них.
    • Учебные материалы обычно всеобщее достояние.
    • Большие комплекты скриптов — читайте лицензию, даже если вы взяли один скрипт из большого комплекта.
    • Если же выдрать скрипты из игры — нарушение копирайта, будут санкции, если кто-то обратится.

    UPD. Если программа бесплатная и не написана кем-то крупным — перескинуй на здоровье, если дал ссылку на оригинал, и нет рекламы и прочих шпионов. Они только рады будут. Если платная, реклама или прочие методы монетизации — нажалуется кто угодно.
    Ответ написан
    Комментировать