C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Оператор goto
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 строк, взял формулу и книгу по численным методам (Самарский wink.gif ) и в посотни строк уложился. smile.gif
Все циклы через goto блин были...
marconi
Отправлено: 04.05.2004, 12:29


Станционный диспетчер

Группа: Участник
Сообщений: 86



Я то же сначала попытался while применить но goto мне показался проще. Потом почитал- что то не так. Ну больше небуду, спасибо. smile.gif smile.gif
Gedeon
Отправлено: 05.05.2004, 09:22


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (olegenty @ 04/05/2004, 12:31)
а goto вообще можно убрать из синтаксиса...

Да не надо его убирать, хоть еще не разу не приходилось использовать, как-то без него обходтлся, но пусть будет, мало ли biggrin.gif .
QUOTE

Мне тут надо было несложный, как оказалось, алгоритм расчета кинетики перевести с фортрана...
Да еще женщина писала...
Пол дня просто разглядывал две страницы листинга с goto через каждые 5-7 строк, взял формулу и книгу по численным методам (Самарский  ) и в посотни строк уложился.
Все циклы через goto блин были...

Ну так Вы ж за это наверное какой-то бонус получили? biggrin.gif А еще говорите goto убрать. biggrin.gif
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



хоть это и твоё сугубо личное мнение, но я с ним тоже согласен biggrin.gif
Георгий
Отправлено: 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 из синтаксиса

Вернуться в Вопросы программирования в C++Builder