реклама на сайте
подробности

 
 
> Оператор GoTo, безусловный переход или правила хорошего тона
J_B
сообщение Sep 29 2006, 15:13
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 17-01-06
Пользователь №: 13 275



Почему считается, что "нехорошо" использовать данного оператора?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ValBag
сообщение Oct 24 2007, 12:06
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 15-03-07
Пользователь №: 26 183



Перечитал всю тему. На мой взгляд отказ от применения GoTo это стародавняя аксиома, которая в большинстве случаев многими принимается на веру. Тот же Страуструп (из топика #11) пишет:
Цитата
Кроме того, операторы goto могут пригодиться в тех случаях,
когда на первый план выходит скорость работы программы. Один из
них - когда в реальном времени происходят какие-то вычисления во
внутреннем цикле программы.
Есть немногие ситуации и в обычных программах, когда применение
goto оправдано. Одна из них - выход из вложенного цикла или
переключателя. Дело в том, что оператор break во вложенных циклах
или переключателях позволяет перейти только на один уровень выше.

Не считайте меня назойливым, еще раз обращаюсь к корифеям. Отредактируйте, пожалуйста текст программы (из топика #44) с пресловутым GoTo, чтобы она работала с другими операторами. Хочу увидеть разницу и приобрести некоторый опыт на живом примере. Ответы "сделай сам" не хотелось бы принимать. Все учились на чужих и своих примерах.
Спасибо!
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 24 2007, 12:27
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(ValBag @ Oct 24 2007, 14:06) *
Отредактируйте, пожалуйста текст программы (из топика #44) с пресловутым GoTo, чтобы она работала с другими операторами.
А чем не нравится мой вариант? Нужны шашечки или ехать? Я переписал не изменив "внешнюю" логику программы, но без goto, кто сказал, что оно должно выглядеть очень похоже на старое? Дословный перевод с языка на язык может либо исказить мысль больше, чем "правильный" перевод, либо выглядеть коряво. А тут мы переводим текст с чего-то типа бейсик-программы, записанной словами С на собственно С smile.gif

Тем более, что изменён только набор кода с клавиатуры, оставлено даже его поведение таким, как было, просто антидребезг и проверка нажатия новой клавиши реализованы несколько по-другому - гибче и расширяемее. Заодно убрана эту ужасающая задержка через wait() с "магическими числами". Всё остальное просто переписано без goto.
Ну вот "тупо" переведённый из goto-шного варианта в не-goto-шный:
CODE
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.4 Standard
Automatic Program Generator
© Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com

Project : Пример 10
Version : 1
Date : 07.03.2006
Author : Belov
Company : Home
Comments:
Кодовый замок


Chip type : ATtiny2313
Clock frequency : 4,000000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/

#include <tiny2313.h>
#define klfree 0x77F // Код состояния при полностью отпущеных кнопках
#define kzad 3000 // Код задержки при сканировании
#define kandr 30 // Константа антидребезга
#define bsize 30 // Размер буфера для хранения кода

unsigned char flz; // Флаг задержки
unsigned int bufr[bsize]; // Буфер в ОЗУ для хранения кода
#pragma warn-
eeprom unsigned char klen; // Ячейка для хранения длины кода
eeprom unsigned int bufe[bsize]; // Буфер в EEPROM для хранения кода
#pragma warn+

// Прерывание по переполнению Таймера 1
interrupt[TIM1_OVF]
void timer1_ovf_isr(void)
{
flz = 1; // Устанавливаем флаг задержки
}

// Прерывание по совпадению в канале A Таймера 1
interrupt[TIM1_COMPA]
void timer1_compa_isr(void)
{
flz = 1; // Устанавливаем флаг задержки
}

// Функция опроса клавиатуры и антидребезга
unsigned int incod(void)
{
unsigned int cod0 = 0; // Локальные переменные
unsigned int cod1;
unsigned char k;

for (k = 0; k < kandr; k++) { // Цикл антидребезга
cod1 = PINB & 0x7; // Формируем первый байт кода
cod1 = (cod1 << 8) + (PIND & 0x7F); // Формируем полный код состояния клавиатуры
if (cod0 != cod1) { // Сравниваем со старым кодом
k = 0; // Если не равны, сбрасываем счетчик
cod0 = cod1; // И присваиваем новое значение старому коду
}
}
return cod1;
}


// Процедура формирования задержки
void wait(unsigned char kodz)
{
if (kodz == 1)
TIMSK = 0x40; // Выбор маски прерываний по таймеру
else
TIMSK = 0x80;
TCNT1 = 0; // Обнуление таймера
flz = 0; // Сброс флага задержки
#asm("sei"); // Разрешаем прерывания
if (kodz != 2)
while (flz == 0); // Цикл задержки
}


// Основная функция
void main(void)
{
unsigned char ii; // Указатель массива
unsigned char i; // Вспомогательный указатель
unsigned int codS; // Старый код

PORTB = 0xE7; // Порт B
DDRB = 0x18;

PORTD = 0x7F; // Порт D
DDRD = 0x00;

TCCR1A = 0x00; // Таймер/Счетчик 1
TCCR1B = 0x03;
TCNT1 = 0;
OCR1A = kzad;

ACSR = 0x80; // Аналоговый компаратор

while (1) { // Главный цикл
while (incod() != klfree); // Ожидание отпускания кнопок
while (incod() == klfree); // Ожидание нажатия кнопок
ii = 0;

// набор кода до конца буфера либо до таймаута между клавишами
while(1) {
#asm("cli"); // Запрещаем прерывания
wait(1); // Задержка 1-го типа
codS = incod(); // Ввод кода и запись, как старого
bufr[ii++] = codS; // Запись очередного кода в буфер
if (ii >= bsize) // Проверка конца буфера
break;

wait(2); // Задержка 2-го типа
while( flz == 0) { // пока не закончился интервал
if (incod() != codS) // Проверка не изменилось ли состояние
continue; // переход на набор кода
}
break; // таймаут - конец набора
}

// реакция на набранный код
if (PINB.7 == 1) { // Проверка переключателя режимов
//------------------------------ Проверка кода
if (klen != ii) // Проверка длины кода
continue; // главный цикл
for (i = 0; i < ii; i++)
if (bufe[i] != bufr[i]) // Проверка самого кода
continue; // главный цикл
} else { //------------------------------ Запись кода в EEPROM
klen = ii; // Запись длины кода
for (i = 0; i < ii; i++)
bufe[i] = bufr[i]; // Запись всех байтов кода
}

//------------------------------ Открывание замка
PORTB .4 = 1;
// Открываем замок
wait(3); // Задержка 3-го типа
PORTB .4 = 0; // Закрываем замок
}
}


p.s. сам я к этому вопросу не отношусь "религиозно" - goto применяю, но только если он действительно улучшает ситуацию.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- J_B   Оператор GoTo   Sep 29 2006, 15:13
- - Yura_K   Как я понимаю, этот оператор неявно присутствует в...   Sep 29 2006, 16:02
|- - J_B   Полностью согласен, взять ассемблер - циклов без м...   Sep 29 2006, 16:22
- - ktod   Это филосовский вопрос. И ответ на него будет: ...   Sep 29 2006, 16:46
- - rezident   Гм. Когда-то давно (больше 15 лет назад) у нас в у...   Sep 29 2006, 16:47
- - jorikdima   Я слышал, что причина в том, что не известно будет...   Sep 29 2006, 16:47
- - bodja74   Потому что оператор безусловного перехода не сохра...   Sep 29 2006, 16:56
|- - singlskv   ЦитатаПочему считается, что "нехорошо" и...   Sep 29 2006, 18:05
|- - bodja74   Цитата(singlskv @ Sep 29 2006, 21:05) [Ис...   Sep 29 2006, 20:32
|- - Сергей Борщ   Цитата(bodja74 @ Sep 29 2006, 23:32) И пе...   Sep 29 2006, 21:57
- - CD_Eater   Программу проще понять, если она состоит из станда...   Sep 29 2006, 17:27
|- - muravei   Цитата(CD_Eater @ Sep 29 2006, 21:27) В н...   Sep 29 2006, 17:31
- - artem100   go to не явно присутствует во всех языках всегда ...   Sep 29 2006, 17:51
- - singlskv   Цитата(J_B @ Sep 29 2006, 19:13) Почему с...   Sep 29 2006, 18:39
|- - Леонид Иванович   Единственная ситуация, когда нужен goto, это обраб...   Sep 29 2006, 19:09
- - _artem_   Сколько людей столько и мнений. Если не злоупотреб...   Sep 29 2006, 22:40
|- - zltigo   Цитата(_artem_ @ Sep 30 2006, 01:40) Была...   Sep 30 2006, 06:10
|- - Petka   Цитата(zltigo @ Sep 30 2006, 10:10) На се...   Sep 30 2006, 09:43
|- - zltigo   Цитата(Petka @ Sep 30 2006, 12:43) С испо...   Sep 30 2006, 10:04
|- - Petka   Цитата(zltigo @ Sep 30 2006, 14:04) Цитат...   Sep 30 2006, 14:40
|- - zltigo   Цитата(Petka @ Sep 30 2006, 17:40) Аргуме...   Sep 30 2006, 15:07
- - J_B   Спасибо высказавшимся, просто написал переход от д...   Sep 30 2006, 04:24
- - CD_Eater   Цитата(zltigo @ Sep 30 2006, 14:04) Цитат...   Sep 30 2006, 12:20
|- - zltigo   Цитата(CD_Eater @ Sep 30 2006, 15:20) А е...   Sep 30 2006, 12:52
- - goodwin   Совсем недавно была дискуссия на телесистемах по п...   Sep 30 2006, 12:41
- - J_B   Особо переделкой без goto не занимался, но кто что...   Sep 30 2006, 14:27
|- - zltigo   Цитата(J_B @ Sep 30 2006, 17:27) Смысл та...   Sep 30 2006, 14:56
|- - xemul   Цитата(J_B @ Sep 30 2006, 18:27) Особо пе...   Sep 30 2006, 15:45
- - zltigo   Код seg[0] = tmp/100; seg[2] = tm...   Sep 30 2006, 15:55
|- - xemul   Цитата(zltigo @ Sep 30 2006, 19:55) Код s...   Sep 30 2006, 16:02
- - prottoss   Выскажусь тоже про goto... так как несколько раз п...   Sep 30 2006, 16:08
- - _artem_   Я использую goto, но это не тот случай. Не проверя...   Sep 30 2006, 17:08
- - WHALE   2 artem_ Вы про цикл с постусловием do while слыша...   Sep 30 2006, 18:40
- - _artem_   WHALE, во первых я не из пешеры), во вторых это не...   Sep 30 2006, 19:55
- - WHALE   for(I=0;I<=2;I++) { do{ TMP_P=TMP; ...   Sep 30 2006, 21:25
- - _artem_   Да никаких извинений не нужно, не обиделся.) Я сам...   Sep 30 2006, 22:17
- - Rst7   Господа, о чем речь? Посмотрите в исходники библио...   Oct 1 2006, 06:54
- - bve   Мне кажется, что "ноги растут" от старин...   Oct 1 2006, 15:19
- - _artem_   Вы правы - http://en.wikipedia.org/wiki/GOTO Но ч...   Oct 1 2006, 15:39
- - _Bill   Цитата(J_B @ Sep 29 2006, 18:13) Почему с...   Oct 2 2006, 07:48
- - AVNN   Что касается AVR и goto, то при использовании опт...   Oct 2 2006, 08:22
|- - _Bill   Цитата(AVNN @ Oct 2 2006, 11:22) Что каса...   Oct 2 2006, 08:35
- - defunct   Всякий овощ полезен будучи приготовленным надлежащ...   Oct 2 2006, 10:12
- - ValBag   Во всех наставлениях по СИ для МК "...настоят...   Oct 24 2007, 06:19
|- - alexander55   Цитата(ValBag @ Oct 24 2007, 10:19) goto...   Oct 24 2007, 07:01
|- - dxp   Цитата(ValBag @ Oct 24 2007, 13:19) Во вс...   Oct 24 2007, 07:19
||- - ReAl   Цитата(dxp @ Oct 24 2007, 09:19) Существу...   Oct 24 2007, 11:55
||- - SasaVitebsk   Цитата(ReAl @ Oct 24 2007, 14:55) Ещё в 9...   Oct 28 2007, 11:32
|- - andron86   Цитата(ValBag @ Oct 24 2007, 08:19) Для п...   Oct 24 2007, 07:23
||- - alexander55   Цитата(andron86 @ Oct 24 2007, 11:23) Раб...   Oct 24 2007, 07:58
||- - zltigo   Цитата(alexander55 @ Oct 24 2007, 10:58) ...   Oct 24 2007, 08:07
|||- - alexander55   Цитата(zltigo @ Oct 24 2007, 12:07) Вот т...   Oct 24 2007, 08:13
||- - andron86   Цитата(alexander55 @ Oct 24 2007, 09:58) ...   Oct 24 2007, 08:38
|- - defunct   Цитата(ValBag @ Oct 24 2007, 09:19) Для п...   Oct 24 2007, 12:42
- - bodja74   В ассемблере вообще ни в чем ограничений нет Пр...   Oct 24 2007, 06:40
- - DASM   Чисто в лоб типа такого Кодwhile (1) { ...   Oct 24 2007, 06:45
- - IEC   Ну результат почти такой же. В текущем примере из-...   Oct 24 2007, 07:07
|- - ReAl   Цитата(IEC @ Oct 24 2007, 09:07) А вообще...   Oct 24 2007, 11:46
- - zltigo   Продолжаем в уже существующей ветке: http://electr...   Oct 24 2007, 07:19
- - ValBag   Прошу прощения за создание новой темы без поиска. ...   Oct 24 2007, 09:49
- - Maddy   А собственно чего все так на бедного goto оплчилис...   Oct 24 2007, 10:02
- - aesok   GCC Bugzilla: Only very good and very bad progra...   Oct 24 2007, 10:04
|- - alexander55   Цитата(aesok @ Oct 24 2007, 14:04) Only v...   Oct 24 2007, 10:21
- - DASM   Не отношу себя ни к вери гуд ни вери бэд, но со вр...   Oct 24 2007, 10:19
- - DASM   OFF - ReAL - а как код в трубочку свернули ?   Oct 24 2007, 11:49
|- - ReAl   Цитата(ValBag @ Oct 24 2007, 14:06) Тот ж...   Oct 24 2007, 12:29
- - DASM   А что по вашему ReAl сделал ?   Oct 24 2007, 12:09
|- - ValBag   Цитата(DASM @ Oct 24 2007, 20:09) А что п...   Oct 24 2007, 12:29
- - ReAl   Раз уж я тут застрял - что я имел ввиду под ...   Oct 24 2007, 12:50
- - ValBag   ReAl ЦитатаА тут мы переводим текст с чего-то типа...   Oct 24 2007, 13:09
|- - defunct   Цитата(ValBag @ Oct 24 2007, 16:09) А чем...   Oct 24 2007, 13:16
|- - ReAl   Цитата(ValBag @ Oct 24 2007, 15:09) ReAl ...   Oct 24 2007, 13:46
|- - ValBag   Цитата(ReAl @ Oct 24 2007, 21:46) пример ...   Oct 24 2007, 14:01
- - ValBag   defunct Понятно, появляется рябь в глазах, а затем...   Oct 24 2007, 13:33
|- - alexander55   Цитата(ValBag @ Oct 24 2007, 17:33) defun...   Oct 24 2007, 13:44
- - ValBag   REAL Шашечек конечно не надо, но и ехать не получа...   Oct 25 2007, 12:45
|- - ReAl   Цитата(ValBag @ Oct 25 2007, 14:45) Самое...   Oct 25 2007, 22:04
- - ValBag   ReAl Теперь все понятно! Только наверное надо ...   Oct 27 2007, 08:58
|- - ReAl   Цитата(ValBag @ Oct 27 2007, 10:58) Тольк...   Oct 27 2007, 10:16
- - sensor_ua   ЦитатаТут эти скобки не обязательны - согласно при...   Oct 27 2007, 10:51


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.10087 секунд с 7
ELECTRONIX ©2004-2016