Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.70.203] |
|
Страницы: (77) « Первая ... 4 5 [6] 7 8 ... 76 77 ( Перейти к последнему сообщению ) |
Сообщ.
#76
,
|
|
|
imo не хватает только break n; ! (в смысле брейк через несколько циклов)
даже в интерпретаторе php есть... это единственное место, где приходится использовать метки |
Сообщ.
#77
,
|
|
|
Цитата bor.is @ это единственное место, где приходится использовать метки А разве приходится? Неужели без них не обойтись? Я конечно слышал о том, что некто, разработчик драйвера TCP/IP стека для BSD сказал, мол, что если вам и удасться реализовать его без goto, то код будет ещё более запутанным и непонятным, но, всё равно, для меня воспользоваться goto - всё равно, что религию предать . |
Сообщ.
#79
,
|
|
|
IMHO, тут дискутировать нечего, ибо
1. Использование goto вырабатывает не очень хорошую(читай очень плохую) привычку "мыслить goto'ми", что сказывается на алгоритмах, в которых без goto можно обойтись без любых костылей. 2. Пока пишешь код для себя - на здоровье(но учесть п.1), но когда другой человек начнёт читать твой код с goto, то, хорошо, если его не стошнит. 3. Всегда есть лаконичный способ избежать goto. |
Сообщ.
#80
,
|
|
|
Сообщ.
#81
,
|
|
|
archimed7592 Ты по ссылке-то ходил? Первый тезис вообще не аргумент, скорее ИМХО. Остальные два в ссылке опровергаются.
Hryak Просто Boroda всех быстро уболтал, а вы так быстро не смогли |
Сообщ.
#82
,
|
|
|
Цитата Qraizer @ Первый тезис вообще не аргумент, скорее ИМХО. Ну, если сходить по ссылке Hryak'а, то можно увидеть, что это IMHO не только моё, но и Дейкстры . Цитата Qraizer @ Остальные два в ссылке опровергаются. Как можно опровергнуть второй тезис я не очень то себе представляю(что, проводили следственный эксперимент: кого стошнит, а кого - нет ?), а опровержения третьему тезису я, увы, не нашёл . |
Сообщ.
#83
,
|
|
|
Цитата archimed7592 @ Ко второму тезису я просто подошёл творчески и стал понимать его буквально. Насчёт опровержения - так Boroda-е так никто и предложил безгоутный вариант его примера. Сам сможешь написать и сравнить с гоутным решением? Я, кстати, могу эту задачу ещё усложнить. Как можно опровергнуть второй тезис я не очень то себе представляю(что, проводили следственный эксперимент: кого стошнит, а кого - нет ?), а опровержения третьему тезису я, увы, не нашёл . |
Сообщ.
#84
,
|
|
|
Цитата Qraizer @ Насчёт опровержения - так Boroda-е так никто и предложил безгоутный вариант его примера. Объявляешь счетчики цикла с инициализацией нулем, убираешь во всех for содержимое до первой ; и убираешь goto с меткой. Всё. |
Сообщ.
#85
,
|
|
|
Цитата Qraizer @ Насчёт опровержения - так Boroda-е так никто и предложил безгоутный вариант его примера. Сам сможешь написать и сравнить с гоутным решением? Я, кстати, могу эту задачу ещё усложнить. Тут скорее возникает вопрос, каким образом вообще возник подобный код. Не существует ли более красивого алгоритма для решения задачи? В той теме это упоминается. |
Сообщ.
#86
,
|
|
|
Цитата gryz @ Тут скорее возникает вопрос, каким образом вообще возник подобный код. Вот о том и речь - использование goto даже очень редко, в последствии порождает подобный код(см. 1-й тезис, который "скорее ИМХО"). |
Сообщ.
#87
,
|
|
|
Цитата Hryak @ Точно всё? Ничего не забыл? Попробуй. Хотя бы на двух вложенных циклах.Объявляешь счетчики цикла с инициализацией нулем, убираешь во всех for содержимое до первой ; и убираешь goto с меткой. Всё. Чтобы не флеймить, вот сразу более сложный пример, который я имел в виду: #include <io.h> #include <conio.h> #include <fstream> #include <iostream> int main() { int i, j, k; if(_access("savedstate.dat", 4)==0) { std::ifstream inFile("savedstate.dat"); bool ok = true; ok = ok && inFile.read(reinterpret_cast<char*>(&i), sizeof(i)).gcount()==sizeof(i); ok = ok && inFile.read(reinterpret_cast<char*>(&j), sizeof(j)).gcount()==sizeof(j); ok = ok && inFile.read(reinterpret_cast<char*>(&k), sizeof(k)).gcount()==sizeof(k); if(ok && (inFile.good() || inFile.eof())) { std::cout << "The saved state is restored successful." << std::endl; goto resume; } return std::cerr << "The saved state restoring error. State file is wrong." << std::endl, 1; } for(i=0; i<10; ++i) for(j=i; j<10; ++j) for(k=j; k<10; ++k) { resume: /* ... */ if(kbhit() && getch() == '\x1B') { if(_access("savedstate.dat", 2)==0) remove("savedstate.dat"); std::ofstream outFile("savedstate.dat"); bool ok = true; ok = ok && outFile.write(reinterpret_cast<char*>(&i), sizeof(i)).good(); ok = ok && outFile.write(reinterpret_cast<char*>(&j), sizeof(j)).good(); ok = ok && outFile.write(reinterpret_cast<char*>(&k), sizeof(k)).good(); if(!(ok && (outFile.good() || outFile.eof()))) return std::cerr << "The state saving error." << std::endl, 1; return std::cout << "The state saved successful." << std::endl, 2; } } if(_access("savedstate.dat", 2)==0) remove("savedstate.dat"); ret } Цитата gryz @ Ну как же? Там же ясно сказано - это было написано для возможности очень долгий алгоритм прервать с сохранением состояния и с возможностью продолжить с запомненного состояния. Ну и что, что это было под DOSом, которая была однозадачной? Счас-то ведь тоже вполне может возникнуть потребность перегрузить ОСь зачем-нибудь...Тут скорее возникает вопрос, каким образом вообще возник подобный код. Не существует ли более красивого алгоритма для решения задачи? P.S. У этого форума есть возможность большие куски кода делать скроллируемыми, чтоб не занимали много места? |
Сообщ.
#88
,
|
|
|
Цитата Qraizer @ Точно всё? Ничего не забыл? Попробуй. Хотя бы на двух вложенных циклах. Да, забыл. Цитата Чтобы не флеймить, вот сразу более сложный пример, который я имел в виду #include <io.h> #include <conio.h> #include <fstream> #include <iostream> int main() { bool resuming = _access("savedstate.dat", 4)==0; for(int i=0; i<10; ++i) for(int j=i; j<10; ++j) for(int k=j; k<10; ++k) { if (resuming) { resuming = false; std::ifstream inFile("savedstate.dat"); bool ok = true; ok = ok && inFile.read(reinterpret_cast<char*>(&i), sizeof(i)).gcount()==sizeof(i); ok = ok && inFile.read(reinterpret_cast<char*>(&j), sizeof(j)).gcount()==sizeof(j); ok = ok && inFile.read(reinterpret_cast<char*>(&k), sizeof(k)).gcount()==sizeof(k); if(ok && (inFile.good() || inFile.eof())) std::cout << "The saved state is restored successful." << std::endl; return std::cerr << "The saved state restoring error. State file is wrong." << std::endl, 1; } /* ... */ if(kbhit() && getch() == '\x1B') { if(_access("savedstate.dat", 2)==0) remove("savedstate.dat"); std::ofstream outFile("savedstate.dat"); bool ok = true; ok = ok && outFile.write(reinterpret_cast<char*>(&i), sizeof(i)).good(); ok = ok && outFile.write(reinterpret_cast<char*>(&j), sizeof(j)).good(); ok = ok && outFile.write(reinterpret_cast<char*>(&k), sizeof(k)).good(); if(!(ok && (outFile.good() || outFile.eof()))) return std::cerr << "The state saving error." << std::endl, 1; return std::cout << "The state saved successful." << std::endl, 2; } } if(_access("savedstate.dat", 2)==0) remove("savedstate.dat"); ret } Вот только не надо со мной спорить, что твой вариант проще, лучше и т.п. Не теряй времени, спорить я с тобой не буду (свое отношение к goto я высказал в указанной мной ранее теме и отношение это с той поры не изменилось). Ты просил безгоутное решение - я его привел. Для людей, принципиально не использующих goto - очень даже сойдёт. Суть в чем - использование goto может сделать структурированную программу неструктурированной. Это goto в вину и вменяют. Однако, приведенная тобой задача изначально имеет антиструктурированный элемент прямо в своей постановке. Логично, что неструктурированность из постановки задачи перетекает в решение и вполне естественно применение тут goto. Но можно его и не применять... |
Сообщ.
#89
,
|
|
|
Зачем же спорить? Количество потраченного времени на битие по клавишам и отладку в совокупности само рассудит. Текст вполне себе читабелен, хоть и чуточку менее интуитивен. Так что в целом авекватные результаты. Впрочем, переприсваивание параметров циклов в теле этих же циклов тоже как-то не совсем структурно, но это уже если придираться.
Только не надо мне приписывать защиту goto. Спорить я начал с аргументами archimed7592-а, а отнюдь не с мнением достаточно авторитетных теоретиков. В лице Дейкстры, в частности. И ссылку привёл просто в подтверждение тезиса не упомянутого по имени "разработчика драйвера TCP/IP стека для BSD". |
Сообщ.
#90
,
|
|
|
Цитата Qraizer @ Спорить я начал с аргументами archimed7592-а Ок, все остались при своём мнение, вопрос исчерпан . |