-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80




Форум на Исходниках.RU


Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://forum.sources.ru.
Данный дневник сформирован из открытого RSS-источника по адресу http://forum.sources.ru/yandex.php, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

Астрономия

Среда, 22 Июля 2020 г. 05:52 + в цитатник
Qraizer: Посмотрели в туристическую трубу x50. Марс тусклый, Венера яркая, Меркурий не видно, Юпитер почему-то светлый, хотя должен быть красноватым, а кольца у Сатурна прелесть. Ну так себе парад.

https://forum.sources.ru/index.php?showtopic=100046&view=findpost&p=3834848


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 05:49 + в цитатник
Qraizer:
Цитата JoeUser @
Ты просто еще не проникся дзеном простоты, не понимаешь всего величия и фундаментальности безусловных переходов!
Посмею напомнить, что искусство программирования называется внезапно искусством. Код должен быть не просто правильным, он должен быть ещё и красивым.
Лично мне вот пофик, кто где как какие паттерны заюзал. Если я смотрю код, и он прекрасен, значит всё было сделано правильно.

Добавлено
:jokingly: А если он ещё и работает...

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834847


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 03:37 + в цитатник
JoeUser:
Цитата D_KEY @
Твой способ не быстрее и не проще способа с RAII, скорее наоборот.

Это всем апологетам RAII так хочется видеть. Потом начинаются конструкторы, деструкторы, смартпоинтеры ...а у меня всего лишь скромная метка для goto. Ты просто еще не проникся дзеном простоты, не понимаешь всего величия и фундаментальности безусловных переходов!

Добавлено
Цитата D_KEY @
Это как с принципом избегать преждевременной оптимизации. Принцип прекрасен, но он не отменяет того факта, что не стоит и "пессимизировать", т.е. если у тебя есть два одинаковых по сложности способа что-то сделать, то логично выбрать тот, что оптимальнее. Это не будет преждевременной оптимизацией.

И я с тобой согласен тут. Но это если действительно одно лучше другого. А если нет? Только Бритва Оккама и спасает.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834845


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 03:11 + в цитатник
D_KEY:
Цитата JoeUser @
В каждом конкретном случае.

Согласен.

Цитата
Но при такой практически нулевой вероятности - предусматривать последующий рефакторинг как минимум странно. Лучше уж к врачу паранойю лечить :)

Так тебе никто не предлагает обмазаться всеми паттернами проектирования и пытаться предусмотреть изменения :)
Твой способ не быстрее и не проще способа с RAII, скорее наоборот.

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

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834843


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 03:04 + в цитатник
JoeUser:
Цитата D_KEY @
То есть как бы ты ни собирал требования, как бы ни проектировал, все равно будут меняться требования и все равно нужно будет менять софт

Ну надо же быть реалистом! В каждом конкретном случае. Да - неизменного нет. Начиная проектировать свою обертку, я задаюсь вопросом "какова вероятность, что процесс логина в SFTP сервер в ближайшее время изменится?" Исходные данные: "14 августа 2006 года было принято решение о прекращении работы над развитием протокола в связи с выполнением основной задачи проекта". Вывод: вероятность внесения новых изменений или требований - минимальная, если им только не взбредет в голову возобновить проект. Да, "никогда не говори никогда". Ну тогда мне, а вернее не мне, немножко не повезет. Но при такой практически нулевой вероятности - предусматривать последующий рефакторинг как минимум странно. Лучше уж к врачу паранойю лечить :)

Wound, Киля, астанавись!!! Я тебя услышал. Выложу код, форкнешь и покажешь мне свое минималистическое количество строк.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834842


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 02:48 + в цитатник
D_KEY:
Цитата JoeUser @
Раз пришлось потом что-то менять - значит это тебе урок: не ленись на начальном проектировании!

Нет :) Мир сложнее, чем ты думаешь. Если быть кратким и использовать модель Кеневин, то разработка софта почти всегда находится в запутанном домене, а не в сложном. То есть как бы ты ни собирал требования, как бы ни проектировал, все равно будут меняться требования и все равно нужно будет менять софт (если только мы политически его не законсервировали). Поэтому лучше как раз при проектировании направить усилия на возможность адаптации и поддержки. Ну в том случае, если речь не о hello world.
Собственно, большая часть паттернов проектирования на это направлено, как и большая часть современных инженерных практик в области софта (юнит-тесты, *DD, CI/CD и пр.), да и принципов тоже (KISS, DRY, противостояние over engineering).

Добавлено
Цитата JoeUser @
Да не вопрос. Я может быть его и на гитхаб выкину (кстати, переписываю его без Qt), . Потому как норм библиотеки для SFTP нету. А платные я покупать не намерен! Вот там и форкнешь.



А у тебя уже есть какие-то проекты выложенные?

Я только собираюсь начать в эту сторону идти, есть пара идей на поиграться.

Добавлено
Цитата JoeUser @
Нет, это единый процесс! :) Полу-логина не бывает.

Я про отделение логики от возни с ресурсами.

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

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834841


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 02:20 + в цитатник
Wound:
Цитата JoeUser @
Если добрались, все эти ресурсы в полях класса висят без какого-то использования, только для удаления.

Что тебе мешает объявить эти ресурсы не в полях класса, а там где конкретно они нужны? Тогда они сразу же и удаляться, как только перестанут быть нужными.
В общем или лыжи не едут или я censored :-?
Тебе рассказывают про то, что хорошо бы работу с отдельными ресурсами вынести в отдельные классы, у тебя бы в таком случае код сократился бы в пять раз в твоей вырвиглазной функции, ты бы отделил логику работы приложения от логики работы с ресурсом, тем самым упростив понимание задачи.
Тут работы на максимум на пару часов, и того меньше, а ты третьи сутки сидишь - и то у тебя не так, и это у тебя не эдак.

Да тут даже вот взять если втупую не думая твой код скопипастить в класс, получается куда лучше и понятнее чем у тебя сейчас есть.
Допустим на примере сессии:
Какая то примитивная обертка(тупо взял все вызовы твоих функций и вынес в метод класса сессии):
    struct SLibssh2_session
    {
    SLibssh2_session()
    {
    m_session = libssh2_session_init();
    if (!m_session) {
    sftpError = sftp_error::session_error;
    throw "session is not initialized...";
    }
    }
    ~SLibssh2_session()
    {
    libssh2_session_disconnect(m_session, "Normal Shutdown, Thank you for playing!");
    libssh2_session_free(m_session);
    }
    void SetBanner(const std::string& banner)
    {
    if(!libssh2_session_banner_set(m_session, banner.c_str()))
    {
    sftpError = sftp_error::session_error;
    throw "can't set baner...";
    }
    }
    void Handshake(int socket)
    {
    if (libssh2_session_handshake(m_session, socket))
    {
    sftpError = sftp_error::handshake_error;
    throw "handshake_error...";
    }
    }
    void SetBlocking(int blocking)
    {
    // перевод в неблокируемый режим
    libssh2_session_set_blocking(m_session, blocking);
    }
    //! Эти методы возможно должны быть вынесены в другой класс, лень заморачиваться, просто ради показать идею.
    std::string HostKeyHash(int flag)
    {
    return libssh2_hostkey_hash(m_session, flag);
    }
    void LoginByUserPwd(const char* login, const char* pwd)
    {
    int ret = 0;
    while ((ret = libssh2_userauth_password(m_session, login, pwd)) == LIBSSH2_ERROR_EAGAIN);
    if (ret) {
    sftpError = sftp_error::auth_error;
    throw "error during LoginByUserPwd...";
    }
    }
    void LoginByPublickey_frommemory(...)
    {
    while ((ret = libssh2_userauth_publickey_frommemory(
    m_session,
    Auth->login.toLocal8Bit().data(),
    Auth->login.length(),
    Auth->public_array.data(),
    Auth->public_array.size(),
    Auth->private_array.data(),
    Auth->private_array.size(),
    Auth->password.toLocal8Bit().data()
    )) == LIBSSH2_ERROR_EAGAIN);
    if (ret) {
    sftpError = sftp_error::auth_error;
    throw "Error in LoginByPublickey_frommemory...";
    }
    }
    private:
    LIBSSH2_SESSION* m_session;
    }

Использование, при этом логика твоего приложения никак не изменилась:
    void mov::qt::sftp_class::slotLogin() {
    struct addrinfo hint;
    struct addrinfo *addrs;
    struct sockaddr_in *sin;
    const char *fingerprint;
    struct addrinfo *p;
    int ret;
    bool found;
    sftpError = sftp_error::no;
    if (sftpState == sftp_state::ready && Auth->authState == auth_state::ok) {
    // инициализация библиотеки
    if (libssh2_init(0) != 0) {
    sftpError = sftp_error::libssh2_error;
    return;
    }
    // поиск адреса хоста
    memset(&hint, 0, sizeof(hint));
    hint.ai_flags = AI_NUMERICHOST;
    hint.ai_family = AF_UNSPEC;
    hint.ai_socktype = SOCK_STREAM;
    hint.ai_protocol = IPPROTO_TCP;
    ret = getaddrinfo(Host.toLocal8Bit().data(), NULL, &hint, &addrs);
    if (ret == EAI_NONAME) {
    hint.ai_flags = 0;
    ret = getaddrinfo(Host.toLocal8Bit().data(), NULL, &hint, &addrs);
    }
    if (ret != 0) {
    sftpError = sftp_error::resolve_error;
    goto cleanup_libssh2_init;
    }
    found = false;
    for (p = addrs; p != nullptr; p = p->ai_next) {
    if (p->ai_family == AF_INET) {
    found = true;
    sin = reinterpret_cast(p->ai_addr);
    break;
    }
    }
    if (!found) {
    sftpError = sftp_error::ip4_error;
    goto cleanup_libssh2_init;
    }
    // создание сокета
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET) {
    sftpError = sftp_error::socket_error;
    goto cleanup_libssh2_init;
    }
    sin->sin_family = AF_INET;
    sin->sin_port = htons(Port);
    // коннект
    ret = ::connect(sock, (struct sockaddr *)(sin), sizeof(struct sockaddr_in));
    if (ret != 0) {
    sftpError = sftp_error::connect_error;
    goto cleanup_socket;
    }
    //======================Было=============================================
    // создание сессии
    // session = libssh2_session_init();
    // if (!session) {
    // sftpError = sftp_error::session_error;
    // goto cleanup_socket;
    // }
    // // установка баннера
    // if (libssh2_session_banner_set(session, "SSH-2.0-OpenSSH_LIBSSH2_1.9.0") != 0) {
    // sftpError = sftp_error::session_error;
    // goto cleanup_session;
    // }
    // // рукопожатие
    // if (libssh2_session_handshake(session, sock)) {
    // sftpError = sftp_error::handshake_error;
    // goto cleanup_session;
    // }
    // // перевод в неблокируемый режим
    // libssh2_session_set_blocking(session, 0);
    // получение отпечатка
    //fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
    // авторизация
    // if (Auth->authType == auth_type::login) {
    // while ((ret = libssh2_userauth_password(
    // session,
    // Auth->login.toLocal8Bit().data(),
    // Auth->password.toLocal8Bit().data()
    // )) == LIBSSH2_ERROR_EAGAIN);
    // if (ret) {
    // sftpError = sftp_error::auth_error;
    // goto cleanup_session;
    // }
    // } else {
    // while ((ret = libssh2_userauth_publickey_frommemory(
    // session,
    // Auth->login.toLocal8Bit().data(),
    // Auth->login.length(),
    // Auth->public_array.data(),
    // Auth->public_array.size(),
    // Auth->private_array.data(),
    // Auth->private_array.size(),
    // Auth->password.toLocal8Bit().data()
    // )) == LIBSSH2_ERROR_EAGAIN);
    // if (ret) {
    // sftpError = sftp_error::auth_error;
    // goto cleanup_session;
    // }
    // }
    //=======================Стало============================================
    try
    {
    SLibssh2_session session;
    session.SetBanner("SSH-2.0-OpenSSH_LIBSSH2_1.9.0");
    session.Handshake(sock);
    session.SetBlocking(0);
    fingerprint = HostKeyHash(LIBSSH2_HOSTKEY_HASH_SHA1);
    if (Auth->authType == auth_type::login)
    {
    session.LoginByUserPwd(Auth->login.toLocal8Bit().data(), Auth->password.toLocal8Bit().data());
    }
    else
    {
    session.LoginByPublickey_frommemory(...);
    }
    }
    catch(const char* error)
    {
    error;
    }
    //====================================================================
    // инициализация ftp-сессии
    do {
    sftp_session = libssh2_sftp_init(session);
    if (!sftp_session) {
    if (libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN)
    waitsocket(sock, session);
    else {
    sftpError = sftp_error::auth_error;
    goto cleanup_session;
    }
    }
    } while (!sftp_session);
    // все четко и дерзко
    sftpState = sftp_state::logged_in;
    return;
    // аварийная очистка
    // cleanup_session:
    // libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing!");
    // libssh2_session_free(session);
    cleanup_socket:
    #ifdef WIN32
    closesocket(sock);
    #else
    close(sock);
    #endif
    cleanup_libssh2_init:
    libssh2_exit();
    }
    }


Добавлено
Разнеси оставшиеся ресурсы с очистками по классам, у тебя от функции останется 40 очевидных строк, которые будут понятны с полувзгляда.
Обертки сами - они так же примитивные, по сути отдельные операции суешь в методы, выделение ресурса - конструктор, удаление - деструктор.
Посмотри на получившийся класс - там сразу видно что это тупо обертка над Си функциями, ошибки детектятся мгновенно, т.к. каждая функция в отдельном методе, и если что можно сосредоточится на методе в 5 строк, нежели на функции в 200 строк вырвиглазного кода. Ошибку в 5 строках кода - найти проще, чем в 200 строках. Т.е. по сути класс ниочемный, но тем не менее - он логику работы с твоей сессией сократил в 3-4 раза.
А если еще прикрутить логирование, в каждый метод, то тут как бы вообще даже если и будет какой то баг, то его без отладки найти будет дело трех минут. В твоем коде не то что бы отладка, тут без двух литров не обойтись чтоб понять где там что произошло.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834840


Метки:  

Астрономия

Среда, 22 Июля 2020 г. 02:07 + в цитатник
B.V.:
Цитата Prince @
Пока ещё можно наблюдать.

Не в условиях городской засветки :no-sad:

https://forum.sources.ru/index.php?showtopic=100046&view=findpost&p=3834839


Метки:  

Сериалы

Среда, 22 Июля 2020 г. 02:05 + в цитатник
B.V.:
Цитата Prince @
Миссис Мейзел закончил 3 сезона.

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

https://forum.sources.ru/index.php?showtopic=168501&view=findpost&p=3834837


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 01:50 + в цитатник
JoeUser:
Цитата JoeUser @
Можешь потом код класса скинуть? Может на RAII переведу, чтоб была полная картина для спора.

Да не вопрос. Я может быть его и на гитхаб выкину (кстати, переписываю его без Qt), . Потому как норм библиотеки для SFTP нету. А платные я покупать не намерен! Вот там и форкнешь.

Цитата D_KEY @
Это не лапша

Нет, это лапша! :)

Цитата D_KEY @
Это не единый процесс

Нет, это единый процесс! :) Полу-логина не бывает.

Добавлено
Цитата D_KEY @
Вот тебе нужно будет поменять что-то в коде load

Для это изначально нужно тщательнее продумывать. И решать лучше проблемы по мере поступления. Раз пришлось потом что-то менять - значит это тебе урок: не ленись на начальном проектировании!

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834836


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 01:35 + в цитатник
D_KEY:
Цитата JoeUser @
Лапша в коде - это генерация "автономных" RAII там, где это неуместно.

Это не лапша, потому что это уже другой код, он к функции load не имеет отношения прямого. Можно отдельно писать (даже разными людьми) и затем поддерживать.
Вот тебе нужно будет поменять что-то в коде load. Тебе придется заново обдумывать, не сломалось ли чего. Мне не придется. У меня логика работы с ресурсами отделена.

Добавлено
Цитата JoeUser @
Во всех мануалх и бест-практиках твердят: используйте инструментарий там, где это уместно.

Да, RAII уместно использовать для работы с ресурсами.

Цитата
искусственное разбиение единого процесса

Это не единый процесс, ИМХО.

Цитата
Короче. Возвращаюсь к goto. Ваши попытки - неубедительны

Да кто ж тебе мешает-то? :)

Можешь потом код класса скинуть? Может на RAII переведу, чтоб была полная картина для спора.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834835


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 01:31 + в цитатник
JoeUser:
Цитата D_KEY @
А если речь об указателях (т.е. ресурсы в виде указателей у тебя), то тебе не нужно писать классы-обертки. Достаточно unique_ptr и typedef/using

Ну у меня почти поровну разных. Первые два - только "факт" что промежуточная инициализация прошла (чтобы потом финализировать). Третий - нужно сразу удалить память после и не хранить. А вот остальные три - указатели на различные структуры.

Цитата D_KEY @
Если тебе нравится лапша в коде, то кто ж тебе помешает?

Лапша в коде - это генерация "автономных" RAII там, где это неуместно. Во всех мануалх и бест-практиках твердят: используйте инструментарий там, где это уместно. Так вот тут, я считаю, лапша - это искусственное разбиение единого процесса, только с одной целью - впилить туда всеми правдами и неправдами RAII. И лапша и костыли - вот это и есть такое навязывание. Короче. Возвращаюсь к goto. Ваши попытки - неубедительны

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834834


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 01:31 + в цитатник
D_KEY: Кстати, я иногда поражался способности некоторых людей быстро анализировать сложный запутанный код с большим количеством переходов и пр.
Это задача не для средних умов явно.
А я в таком коде точно сделаю кучу багов и буду не способен поддерживать его уже через пару дней после написания.

Так что для таких как я остается только декомпозировать, максимально упрощать, делать небольшие блоки, которые отвечают за что-то одно, максимально автоматизировать, писать юнит-тесты и т.д. и т.п.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834833


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 01:13 + в цитатник
D_KEY:
Цитата JoeUser @
Если добрались, все эти ресурсы в полях класса висят без какого-то использования, только для удаления.

Так ведь именно так и будет в том случае, который тебе предлагают :) Я так и не понял что тебе не нравится.

А если речь об указателях (т.е. ресурсы в виде указателей у тебя), то тебе не нужно писать классы-обертки. Достаточно unique_ptr и typedef/using

Добавлено
Тут ведь что важно. Код всяких load станет проще и чище. Да, за счет дополнительных утилитарных структурок/typedef.

Добавлено
Цитата JoeUser @
Поэтому - гвардов вполне достаточно, хоть и таких мудреных с if-фами.

Если тебе нравится лапша в коде, то кто ж тебе помешает? :D

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

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834832


Метки:  

goto vs break & continue

Среда, 22 Июля 2020 г. 01:09 + в цитатник
JoeUser:
Цитата OpenGL @
(например, если это не единственное место, где нужны эти ресурсы)

Вооо, вернулись к началу начал Сколько я уже страниц бъюсь, пытаюсь объяснить - для моего примера важно только конечное состояние при выделении этих всех ресурсов! А именно , добрались ли мы до логина в SFTP или нет. Если добрались, все эти ресурсы в полях класса висят без какого-то использования, только для удаления. И, по-сути, их все можно считать одним ресурсом. Ибо "частичный" логин (например, создали сокет, а соединиться не можем) смысла не имеет, и все откатываем в начало. Поэтому - гвардов вполне достаточно, хоть и таких мудреных с if-фами.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834831


Метки:  

Имя устройства физического диска

Вторник, 21 Июля 2020 г. 23:21 + в цитатник
Qraizer:
Цитата Jin X @
Что такое RS'ы?
COM-порты. Но там и задача была сложнее: нужно было найти конкретный девайс по его COMномеру:, отыскать его родительное устройство, проверить, что оно конкретная USB-шелезяка и выторкнуть/перевоткнуть. Шелезяку, не COM.
Цитата Jin X @
Я обычно тупо делаю перебор номеров от 0 до 15. Кстати, какое кол-во дисков может быть максимум?
Теоретически олимпиллиард. Вот тут можно посмотреть на дикую смесь C и Плюсов, но он не даст полной инфы. Впрочем, это зависит от того, какие устройства вообще интересуют.

https://forum.sources.ru/index.php?showtopic=419205&view=findpost&p=3834828


Метки:  

ЕГЭ по информатике 2020, часть 1, № 22

Вторник, 21 Июля 2020 г. 22:44 + в цитатник
swf: Решение.
Вначале разберёмся с командой умножения на 3, которой не было в задаче про лестницу.
Её можно применить ровно один раз – получить 9 из 3. 3 * 4 = 12, перескакиваем через число 9, которое должно присутствовать в траектории. Запомним, что 9 можно получить из 3 1 способом с помощью команды 2.
Получили задачу получения 14 из 3 с помощью команд +1 и +2, и чтобы в траектории была 9. Разделим эту задачу на две подзадачи.

Подзадача 1, получение числа 9 из числа 3
Задача совершенно аналогична задаче про лестницу.
Только там мы начинали с пола (0-й ступеньки), а здесь начинаем с 3-й ступеньки.
K(i) = K(i–2) + K(i–1), i >= 6.
K(4) = 1, K(5) = 2.

Поэтому таблица выглядит так:
K(4)K(5)K(6)K(7)K(8)K(9)
1235813

Итого 1 + 13 = 14 способов получения числа 9.

Подзадача 2, получение числа 14 из числа 9
Пусть мы уже находимся на 9-й ступеньке, неважно, как мы туда попали.
К слову, это очень важное свойство нашей задачи! Нам не нужно помнить, как мы попали в текущее состояние. Если бы это было не так (система имела последействие), то задачу нельзя было бы решать методом динамического программирования.
K(i) = K(i–2) + K(i–1), i >= 12.
K(10) = 1, K(11) = 2.

Таблица:

K(10)K(11)K(12)K(13)K(14)
12358

Итого 8 способов набрать 14, начиная с 9 и используя команды +1 и +2.

Теперь соединяем решения обеих подзадач в одно: с 3-й ступеньки попасть на 9-ю можно 14 способами, с 9-й ступеньки подняться на 14-ю можно 8 способами.
Итого 14 * 8 = 112 способов (программ).

Ответ: 112 .

https://forum.sources.ru/index.php?showtopic=419207&view=findpost&p=3834827


Метки:  

Что мы сейчас читаем

Вторник, 21 Июля 2020 г. 22:35 + в цитатник
ya2500: Тэд Чан, рассказ: Омфал / Omphalos (2019).

Археолог, успешно доказавшая факт сотворения Господом Богом Земли и человечества, оказывается перед кризисом веры из-за ошеломляющего открытия другого учёного. Найти этот небольшой рассказ можно в сборнике здесь - я скачал сборник в формате fb2 и нашёл нужный рассказ в оглавлении.

https://forum.sources.ru/index.php?showtopic=169262&view=findpost&p=3834825


Метки:  

"Фальконы" таки летают!

Вторник, 21 Июля 2020 г. 21:56 + в цитатник

Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 13:03 + в цитатник
JoeUser:
Цитата Wound @
Почитай как работает система исключений в С++ при конструировании объекта.

:blink: а то я не знаю?

Цитата Wound @
На ка тебе пример еще в догонку, расскажи пожалуйста что тут работает не так, как ты описал? Очень интересно послушать.

1) Ты собираешь независимые ресурсы в свой wrapper (хотя логичнее назвать holder). У меня они зависимые. Т.е. результат одного передается в инициализацию другого. Но и это не главное.
2) Один (или несколько, пока один) из ресурсов у меня "временный" и его хранить не нужно. Т.е. r1,rc2, rc3, rc4 проинициализировали, все rc3 уже не нужен, удалили, потом - rc5, rc6
3) Ну и самое наверное важное - ты решил в свой wrapper запилить в конструкторе больше чем нужно. Т.е., как объект создается - так он сразу бежит логиниться. Такое мне не нужно!

Но я понимаю, к чему ты клонишь - раздербанить мой sftp_class в целую "инфраструктуру", типа:

winsock_class - WSAStartup /WSACleanup();
libssh2_class - libssh2_init / libssh2_exit
resolv_slass - getaddrinfo / freeaddrinfo
socket_class - socket / closesocket
connect_class - connect / shutdown
libssh2_session_init_class - libssh2_session_init / libssh2_session_free
libssh2_sftp_sesstion_class - libssh2_sftp_init / libssh2_sftp_shutdown

Потом мне придется писать такую же портянку исключений, чтобы понять кто бросил, и можно ли продолжить работу ( допустим сделать еще 3 попытки соединения)

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

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834791


Метки:  

Поиск сообщений в rss_forum_sources_ru
Страницы: 2628 ... 2382 2381 [2380] 2379 2378 ..
.. 1 Календарь