marconi |
Отправлено: 04.05.2004, 09:16 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
label:
bool OnLine;
OnLine=InternetGetConnectedState(NULL,NULL); // проверяем наличие инета
if(OnLine==true)
{ // если интернет есть то...
WinExec("D:\Natali.exe",SW_RESTORE); // запускаем приложение
}
else
goto label; // если нет ждем
В книге Кента Рейсдорфа написано,что использование оператора GOTO в программах на С++ является плохим стилем. Тогда как можно записать другим образом?
|
|
Asher |
Отправлено: 04.05.2004, 10:46 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
CODE |
while(!InternetGetConnectedState(NULL,NULL)){//Цикл пока не соединимся
Application->ProcessMessages();//Дать поработать другим
//Можно добавить какую-нибудm паузу типа Sleep(5000);//5 сек.
}
//Интернет есть!
WinExec("D:\Natali.exe",SW_RESTORE); // запускаем приложение
|
|
|
olegenty |
Отправлено: 04.05.2004, 11:29 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
а goto вообще можно убрать из синтаксиса...
|
|
Asher |
Отправлено: 04.05.2004, 12:00 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
QUOTE | а goto вообще можно убрать из синтаксиса... |
НУЖНО убрать из синтаксиса!!!
Мне тут надо было несложный, как оказалось, алгоритм расчета кинетики перевести с фортрана...
Да еще женщина писала...
Пол дня просто разглядывал две страницы листинга с goto через каждые 5-7 строк, взял формулу и книгу по численным методам (Самарский ) и в посотни строк уложился.
Все циклы через goto блин были...
|
|
marconi |
Отправлено: 04.05.2004, 12:29 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Я то же сначала попытался while применить но goto мне показался проще. Потом почитал- что то не так. Ну больше небуду, спасибо.
|
|
Gedeon |
Отправлено: 05.05.2004, 09:22 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (olegenty @ 04/05/2004, 12:31) | а goto вообще можно убрать из синтаксиса... |
Да не надо его убирать, хоть еще не разу не приходилось использовать, как-то без него обходтлся, но пусть будет, мало ли .
QUOTE |
Мне тут надо было несложный, как оказалось, алгоритм расчета кинетики перевести с фортрана...
Да еще женщина писала...
Пол дня просто разглядывал две страницы листинга с goto через каждые 5-7 строк, взял формулу и книгу по численным методам (Самарский ) и в посотни строк уложился.
Все циклы через goto блин были... |
Ну так Вы ж за это наверное какой-то бонус получили? А еще говорите goto убрать.
|
|
olegenty |
Отправлено: 05.05.2004, 10:05 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
так они на ыортране у него были, переписал-то на C++ и без goto
убрать-убрать, нефиг соблазнять молодых этим дурацким оператором... сиди потом, разбирайся...
|
|
Георгий |
Отправлено: 05.05.2004, 11:18 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
по хорошему всё можно реализовать без goto:
CODE | for(...)//перебор чего-нибудь
{
switch(это что-нибудь)
case нечто:
for(...)//какой нибудь анализ
if(что то не так) goto на следующую интерцию основного цикла
else сделать что-то ужасное
case следующее нечто, сюда также попадаем из предыдущего нечто
break;
метка начала следующей интерации:
}; |
очевидно, что функция перегружена действиями. её следует разбить на подфункции:CODE | for(...)//перебор чего-нибудь
{
вызов подфункции
}
тело подфункции{
switch(это что-нибудь)
case нечто:
for(...)//какой нибудь анализ
if(что то не так) return;
else сделать что-то ужасное
case следующее нечто, сюда также попадаем из предыдущего нечто
break;} |
вот и получился вариант без goto
по скорости работы 2й вариант практически не отличается от 1го, но следует учитывать, что:
1. выполняется вызов функции ~20 тактов (если в цикле)
2. оптимизирующий компилятор не видит картины в целом и иногда получается, что возрастают накладные расходы ЯВУ
итого: без goto код упрощается (для человека) и усложняется для машины.
мой вывод — убирать goto не надо, а, как и любой мощный и опасный инструмент, спрятать от неграмотных товарищей. |
|
Asher |
Отправлено: 05.05.2004, 11:49 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Хм. Не ожидал.
QUOTE | if(что то не так) goto на следующую интерцию основного цикла |
Для замены этого существует вполне законный способ — continue;
|
|
olegenty |
Отправлено: 05.05.2004, 12:24 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
если уж говорить об оптимизации, реальной, для взрослых, то узкие места на асме надо крапать, вот там и джампать, сколько влезет, а goto всё же не нужен.
|
|
Asher |
Отправлено: 05.05.2004, 13:41 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Проблема goto не в узких местах или каком-то там плохом стиле.
Проблема в невозможности, в общем случае, определения состояния переменных.
Все легальные переходы: return, break и continue ходят в одну определенную, четко предсказываемую по всем состояниям точку. С goto этого нет. Здесь можно на такую граблю наступить, если наобум пользоваться, что за... раскапывать. И шишка будет больше головы.
Классики goto не рекомендуют использовать чтобы программеры не привыкали скакать от балды, по поводу и без. Даже в асме скакать следует осторожно, по известным местам и желательно недалеко.
|
|
olegenty |
Отправлено: 05.05.2004, 14:08 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
хоть это и твоё сугубо личное мнение, но я с ним тоже согласен
|
|
Георгий |
Отправлено: 05.05.2004, 19:01 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
QUOTE (Asher @ 05/05/2004, 12:51) | Хм. Не ожидал.
QUOTE | if(что то не так) goto на следующую интерцию основного цикла |
Для замены этого существует вполне законный способ — continue; |
CODE | for(...)//перебор чего-нибудь
{
for(...)//какой нибудь анализ
if(что то не так) goto на следующую интерцию основного цикла
};
|
2 вложенных цикла — continue не поможет
я не согласен только с исключением goto из синтаксиса |
|