Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.62.45] |
|
Страницы: (32) « Первая ... 19 20 [21] 22 23 ... 31 32 ( Перейти к последнему сообщению ) |
Сообщ.
#301
,
|
|
|
Цитата JoeUser @ Вот это самый важный вопрос!!! "Откуда я знаю что эта портянка говнокода, которую ты привел, делает ?" - но советую! Ты - кросава!!! Киля, запомни, и расскажи всем родным и близким - "диавол кроется в мелочах"! Я исходил из того что ты привел самодостаточный код, посему написал тебе основу идеи, заметив - что у тебя там очень страшный код, в котором легко запутаться. Цитата JoeUser @ Ошибаешься, это - эталон эталонов говна! Ну бывают такие взаимосвязи в состояниях систем, что да - хочется срать говном. Но если на кону зарплата/гонорар - засунь себе уникальный поинтер в жопу, но просто сделай, чтобы работало. Это так ты решил оправдать свой пример, которому просил хорошую альтернативу, а все идеи тут же раскритиковал? Я такое даже в пьяном угаре бы не смог написать под дулом пистолета. Потому что в этом запутаться можно по ходу написания этого говна. С чем тебя и поздравляю! Цитата JoeUser @ Я уже 10 лет работаю сам на себя. Максимум - расстреляют, но я не лезу в политику, не митингую. Ну если только изредка, устраиваю молчаливый пикет с вискарем - дома Мечтаю съездить в Париж, поссать с Эйфелефой башни, ибо построить такую мне мешает Путин! В С++ идиома RAII появилась вместе с появлением классов и деструкторов. Т.е. ей больше 10 лет, идея простая и безотказная как топор, очень странно видеть людей, которые пишут вроде на С++, но с основной его идеей не знакомы, и пытаются выдумать какую то чушь, используя всякий бред типа goto там, где ему не место. Ты ведь должен понимать что твои примеры - нечитабельны от слова совсем, плохо подвержены рефакторингу, не устойчивы к различным ошибкам, и сами являются кладезью подводных камней? Хотя о чем это я.... |
Сообщ.
#302
,
|
|
|
korvin, пока я не заснул - давай переписывай!
Следи за движениями: 1) lv = init1(&r1); // произошла инициализация USB-драников 2) cv1 = init2(&r2); // попытка инициализации USB-бетономешалки, но она сломалась в обед! Не удается залить соседа бетоном - облом!!! Мож хоть драников поедим??? Но, чудя по твоему коду, мы не дождемся драников - release2(r1); Короче, драники отдавай, да?! |
Сообщ.
#303
,
|
|
|
Цитата Wound @ а все идеи тут же раскритиковал? И ничего я не критиковал! И вааще всем сенксы, что тратите время на меня. А если будет альтернативный (эталонно-качественный код) - гарантирую УВАЖУХУ!!! Цитата Wound @ Я такое даже в пьяном угаре бы не смог написать под дулом пистолета. Потому что в этом запутаться можно по ходу написания этого говна. Молод ты еще - прокачивай IQ. Это пригодиться для оценки нестандартных систем. Да и говна в голове будет меньше, ибо - ты познаешь дзен. Цитата Wound @ В С++ идиома RAII появилась вместе с появлением классов и деструкторов. Т.е. ей больше 10 лет, идея простая и безотказная как топор, очень странно видеть людей, которые пишут вроде на С++, но с основной его идеей не знакомы, и пытаются выдумать какую то чушь, используя всякий бред типа goto там, где ему не место. Полностью с тобой согласен! Цитата Wound @ Ты ведь должен понимать что твои примеры - нечитабельны от слова совсем, плохо подвержены рефакторингу, не устойчивы к различным ошибкам, и сами являются кладезью подводных камней? Хотя о чем это я.... Не согласен вот тут с тобой совсем!!! GOTO - КЛАССНАЯ ВЕЩЬ!!! Это - раритет, это олд-сулл, это модно, спортивно и УЖЕ молодежно!!! Или не? |
Сообщ.
#304
,
|
|
|
Цитата JoeUser @ Молод ты еще - прокачивай IQ. Это пригодиться для оценки нестандартных систем. Да и говна в голове будет меньше, ибо - ты познаешь дзен Хорошая отмазка Цитата JoeUser @ Полностью с тобой согласен! А приводишь говно какое то, и еще кичишься, когда тебе приводят эталонные решения. Цитата JoeUser @ Не согласен вот тут с тобой совсем!!! Это от того что ты не работаешь с крупными проектами. Пишешь себе там как ИП, сам потом свое же и ковыряешь. Я многого повидал, но таких говнокодов не видел. Цитата JoeUser @ GOTO - КЛАССНАЯ ВЕЩЬ!!! Это - раритет, это олд-сулл, это модно, спортивно и УЖЕ молодежно!!! Ну писать говно подобное тому что ты выше приводил - самое то. Его(goto) можно использовать, но его необходимо использовать с пользой, в твоих примерах пользы от него 0, больше негатива. |
Сообщ.
#305
,
|
|
|
Цитата Wound @ приводят эталонные решения Не, не видел ... один свистеж Цитата Wound @ Я многого повидал, но таких говнокодов не видел. Не сдерживай себя - гони по полной! Эти твари, создатели libssh2 тебя явно недостойны, гавнюки!!! Я то-типа копипастер (рядом стоял), это все они - недостойные!!! Цитата Wound @ Ну писать говно подобное тому что ты выше приводил - самое то Просто у тебя не достаточно опята, чтобы осознать всю красоту ПРЕКРАСНОГО GOTO!!! Просто не дорос, не прочувствовал, не осознал. Не парься - все это лечит время. |
Сообщ.
#306
,
|
|
|
Цитата JoeUser @ Не, не видел ... один свистеж Ты их критиковал! А теперь говоришь - не видел. Цитата JoeUser @ Не сдерживай себя - гони по полной! Эти твари, создатели libssh2 тебя явно недостойны, гавнюки!!! Я то-типа копипастер (рядом стоял), это все они - недостойные!!! Причем тут они? Ты их код привел? И чего? Он от этого лучше не стал, как был говном - так и остался. Что ты сказать то хотел, я не понимаю? Ровно такого же кода тонны можно встретить в MSDN - писали там индусы, видимо libssh2 писали тоже индусы Цитата JoeUser @ Просто у тебя не достаточно опята, чтобы осознать всю красоту ПРЕКРАСНОГО GOTO!!! Просто не дорос, не прочувствовал, не осознал. Не парься - все это лечит время. Да? А мне кажется это ты деградировал до уровня, лепить goto туда где он нафиг не упал. |
Сообщ.
#307
,
|
|
|
JoeUser, плохой пример. Прочти про RAII и попробуй сам набросать код. Потом можно тут обсудить будет.
Сразу замечу, что обертку нужно писать(или не нужно, если использовать умные указатели) не на каждый объект ресурса, а только на каждый тип, после чего обертка может быть использована везде, где идет работа с этим ресурсом, и код станет гораздо чище. |
Сообщ.
#308
,
|
|
|
Цитата D_KEY @ oeUser, плохой пример. Прочти про RAII и попробуй сам набросать код. Потом можно тут обсудить будет. Сразу замечу, что обертку нужно писать(или не нужно, если использовать умные указатели) не на каждый объект ресурса, а только на каждый тип, после чего обертка может быть использована везде, где идет работа с этим ресурсом, и код станет гораздо чище. Ага! Я за все это время не смог прочитать про RAII, и не смог его стопицот раз осознать?!! Ты это серьезно??? А я тебе предлагаю переработать свой код - и показать всю красоту красот. Есть и реальный код, есть и "синтетика". Все есть в обсуждении - жду пруфы в виде красивого кода. Без кода - буквы читать не буду. Нафик. |
Сообщ.
#309
,
|
|
|
Цитата JoeUser @ А я тебе предлагаю переработать свой код - и показать всю красоту красот. Есть и реальный код, есть и "синтетика". Все есть в обсуждении - жду пруфы в виде красивого кода. Без кода - буквы читать не буду. Нафик. Так ты расскажи что в моем коде не так? Ты код korvin что то там критиковал, а на мой не обратил внимания? Добавлено Мой код займет меньше твоего по количеству строчек. Туда еще три строчки добавить только осталось чтоб полностью имтировать твой пример |
Сообщ.
#310
,
|
|
|
Цитата JoeUser @ Ага! Я за все это время не смог прочитать про RAII, и не смог его стопицот раз осознать?!! Я не могу знать, что ты там осознал Но пишешь ты так, как будто не понял, да. Добавлено Цитата JoeUser @ А я тебе предлагаю переработать свой код - и показать всю красоту красот. Ты имеешь в виду свой код с goto отсюда? Ну хорошо, приведу на днях свой вариант. |
Сообщ.
#311
,
|
|
|
Видишь ли, JoeUser, ты начал с очень известного и прекрасно себя зарекомендовавшего паттерна для C, который, ввиду того, что переписываешь его на C++, естественно тебе не понравился, ибо в Плюсах его можно переписать архитектурно иначе, и с тобой по этому поводу начали дискуссию, а тут синтезировал совсем другой код, под исходный очень известный и прекрасно себя зарекомендовавший паттерн для C не попадающий. Почему у начавших дискуссию нет желания им заниматься, думаю, удивляться не стоит.
|
Сообщ.
#312
,
|
|
|
JoeUser, у нормальных плюсовиков это будет выглядеть хотя бы так
// Ресурс libssh_init/libssh_exit struct SshInit { bool initialized; SshInit(bool init_flag = false) : initialized(init_flag) {} SshInit(SshInit &&old) noexcept { old.initialized = false; } SshInit &operator=(SshInit &&old) noexcept { old.initialized = false; } ~SshInit() { if (initialized) libssh2_exit(); } }; // Ресурс socket/close struct Socket { int socket; Socket(int s = -1) : socket(s) {} Socket(Socket &&old) noexcept { socket = old.socket; old.socket = -1; } Socket &operator=(Socket &&old) noexcept { deinit(); socket = old.socket; old.socket = -1; return *this; } ~Socket() { deinit(); } void deinit() { if (socket != -1) { #ifdef WIN32 closesocket(sock); #else close(socket); #endif } } }; // Ресурс libssh_session_init/libssh_session_free struct Session { LIBSSH2_SESSION *session; Session(LIBSSH2_SESSION *s) : session(s) {} Session(Session &&old) noexcept { session = old.session; old.session = nullptr; } Session &operator=(Session &&old) noexcept { deinit(); session = old.session; old.session = nullptr; return *this; } ~Session() { deinit(); } void deinit() { if (session) { libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing!"); libssh2_session_free(session); } } }; sftp_error slotLoginInternal() { struct addrinfo hint; struct addrinfo *addrs; struct sockaddr_in *sin; const char *fingerprint; struct addrinfo *p; int ret; bool found; // инициализация библиотеки if (libssh2_init(0) != 0) { return sftp_error::libssh2_error } SshInit local_ssh(true); // поиск адреса хоста 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) { return sftp_error::resolve_error; } found = false; for (p = addrs; p != nullptr; p = p->ai_next) { if (p->ai_family == AF_INET) { found = true; sin = reinterpret_cast<sockaddr_in *>(p->ai_addr); break; } } if (!found) { return sftp_error::ip4_error; } // создание сокета int socket_id = socket(AF_INET, SOCK_STREAM, 0); if (socket_id == INVALID_SOCKET) { return sftp_error::socket_error; } Socket local_socket(socket_id); sin->sin_family = AF_INET; sin->sin_port = htons(Port); // коннект ret = ::connect(sock, (struct sockaddr *)(sin), sizeof(struct sockaddr_in)); if (ret != 0) { return sftp_error::connect_error; } // создание сессии LIBSSH2_SESSION *session = libssh2_session_init(); if (!session) { return sftp_error::session_error; } Session local_session(session); // установка баннера if (libssh2_session_banner_set(session, "SSH-2.0-OpenSSH_LIBSSH2_1.9.0") != 0) { return sftp_error::session_error; } // рукопожатие if (libssh2_session_handshake(session, sock)) { return sftp_error::handshake_error; } // перевод в неблокируемый режим 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) { return sftp_error::auth_error; } } 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) { return sftp_error::auth_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 { return sftp_error::auth_error; } } } while (!sftp_session); // все четко и дерзко sftpState = sftp_state::logged_in; // Сохранение локальных ресурсов в переменные класса session = std::move(local_session); socket = std::move(local_socket); ssh_init = std::move(local_ssh); return sftp_error::no; } void mov::qt::sftp_class::slotLogin() { if (sftpState == sftp_state::ready && Auth->authState == auth_state : k) { sftpError = slotLoginInternal(); } } Уже одно это проще в поддержке даже несмотря на то, что тебе нужно учитывать порядок объявления полей ресурсов в классе. |
Сообщ.
#313
,
|
|
|
OpenGL, ну идея понятна. Благодаря беседе я у себя недочет нашел. Соответственно он и в твоем коде. Забыл про cleanup соединения. Так что еще класс лепить нужно. Но, если честно, если выбирать между советами - мне предложение Кили больше понравилось.
|
Сообщ.
#314
,
|
|
|
Цитата JoeUser @ OpenGL, ну идея понятна. Благодаря беседе я у себя недочет нашел. Соответственно он и в твоем коде. Забыл про cleanup соединения. Так что еще класс лепить нужно. Во-первых, если там указатели, то можно просто воспользоваться unique_ptr/shared_ptr (так из примера OpenGL можно убрать Session и заменить на умный указатель). Во-вторых, еще раз, такой класс-обертку ты напишешь один раз, а использовать его можно много где (в отличие от goto, который придется писать в каждой подобной функции) и везде твой код (самой функции) станет чище и проще. |
Сообщ.
#315
,
|
|
|
Цитата JoeUser @ Но, если честно, если выбирать между советами - мне предложение Кили больше понравилось. Да ради бога. Мне просто не нравится подобный стиль с deleter-ами, но это исключительно моё субъективное мнение, от проблем же, которые есть в твоём изначальном коде, его решение точно так же защищает. |