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

 
 
6 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Оператор GoTo, безусловный переход или правила хорошего тона
prottoss
сообщение Sep 30 2006, 16:08
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Выскажусь тоже про goto... так как несколько раз приходилось применять его в проектах на Си под х86 и AVR. Использовал его в вот в таком частном случае:

Код
// Глобальная переменная, изменяемая сторонним потоком
g_Value;

// Главный цикл
for(char x = 0; x < 100; x++)
{
выполняем полезную работу
......................

еще один цикл
for(char y = 0; y < 200; y++)
{
выполняем еще одну полезную работу
.....................

и еще один цикл
for(char i = 0; i < 300; i++)
{
// проверяем глобальную переменную
if(KILL_ALL_CYCLES == g_Value)
{
goto down;
}
else
{
выполняем еще одну полезную работу
}


}


}


}

down:
// едем дальше


--------------------
Go to the top of the page
 
+Quote Post
_artem_
сообщение Sep 30 2006, 17:08
Сообщение #32


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Я использую goto, но это не тот случай. Не проверял на ошибки - проверьте все ли там холосо):


Код
for(I=0;I<=2;I++)
{
LABEL:
   TMP_P=TMP;
   TMP=TMP-X;
   if(TMP<0)
   {
      SEG[i]=VAL;
      VAL=0;
      TMP=TMP_P;
      X=X/10;
   }
   else
   {
      VAL=VAL++;
      goto LABEL;
   }
}


for(I=0;;)
{
   TMP_P=TMP;
   TMP=TMP-X;
   if(TMP<0)
   {
      SEG[i]=VAL;
      VAL=0;
      TMP=TMP_P;
      X=X/10;
      if(++I > 2)
         break;
   }
   else
      VAL=VAL++;
}


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
WHALE
сообщение Sep 30 2006, 18:40
Сообщение #33


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



2 artem_ Вы про цикл с постусловием do while слышали?В вашем случае goto абсолютно ни к селу
ни к городу.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
_artem_
сообщение Sep 30 2006, 19:55
Сообщение #34


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



WHALE, во первых я не из пешеры), во вторых это не мой случай а xemul'a,) в третьих я против использования
goto в этом примере) в четвертых был бы рад если Вы показали Ваш собственный вариант этой функции с использованием конструкции do/while.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
WHALE
сообщение Sep 30 2006, 21:25
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



for(I=0;I<=2;I++)
{
do{
TMP_P=TMP;
TMP=TMP-X;
if(TMP>=0) ++VAL;
}
while(TMP>=0)
SEG[i]=VAL;
VAL=0;
TMP=TMP_P;
X=X/10;
}

_artem_Извиняюсь,погорячился,тоже кривовато получается,но все-таки можно и без GOTO cranky.gif
Еще раз извиняюсь,прочел предыдущую страницу,это все вообще не из той оперы.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
_artem_
сообщение Sep 30 2006, 22:17
Сообщение #36


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Да никаких извинений не нужно, не обиделся.) Я сам грешу этим довольно таки часто.
Удачи.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 1 2006, 06:54
Сообщение #37


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Господа, о чем речь? Посмотрите в исходники библиотеки - функция printf, а точнее _formatted_write - там с goto все в порядке - в смысле - дофига wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
bve
сообщение Oct 1 2006, 15:19
Сообщение #38


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 20-02-05
Из: Ленинградская обл.
Пользователь №: 2 765



Мне кажется, что "ноги растут" от старинного труда Дейкстры"Структурное программирование".
В нем как раз обосновывались принципы написания кода, которые, в теории, должны были
уменьшить количество ошибок и облегчить жизнь программистам.
В том числе там рекомендовались и разбиение на куски ( процедуры ) размером не более экрана-двух,
стиль "программирование сверху-вниз" и "снизу-вверх", и т.д.
Оператор GOTO и попал там в опалу, поскольку нарушал стройность и красивость....
А по делу - пишите - как удобнее, только комментариев побольше.....
Go to the top of the page
 
+Quote Post
_artem_
сообщение Oct 1 2006, 15:39
Сообщение #39


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Вы правы - http://en.wikipedia.org/wiki/GOTO

Но что интересно:

"there are some tasks that cannot be straightforwardly accomplished in many programming languages without the use of GOTO statements, such as breaking out of nested loops and exception handling."

и имхо это действительно так.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
_Bill
сообщение Oct 2 2006, 07:48
Сообщение #40


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(J_B @ Sep 29 2006, 18:13) *
Почему считается, что "нехорошо" использовать данного оператора?

Дурным тоном в программировании является не само использование оператора goto, а его частое и неоправданное использование. В таких случаях программа получается запутанной и трудной для понимания, а, стало быть, для отладки или соправождения. Современные языки программирования (Си в том числе) имеют управляющие конструкции, позволяющие в принципе обходится без goto. Однако в ряде случаев использование goto позволяет сделать программу более понятной. Речь идет о тех случаях, когда необходимо сделать выход из вложенных циклов. В таких случаях оператор goto позволяет исключить введение множества флагов, используемых для проверки условия принудительного выхода из циклов. При этом программа получается не только более наглядной, но и более эффективной.
Основное правило использования goto - переход только вперед. Если goto используется для перехода назад, то это означает, что необходимо воспользоваться каким-либо оператором цикла и/или оператором принудительного перехода к очередной итерации цикла - continue.
А вообще, непонятную и нечитаемую программу можно легко написать и не используя оператор goto. Это часто происходит потому, что человек еще не совсем представляет что именно ему нужно. Поэтому, прежде чем писать код, лучше сначала продумать структуру программы. Методы структурного программирования известны не один десяток лет. В современных языках программирования имеются все необходимые конструкции для создания структурированных программ: последовательно исполняемые операторы (простые и составные), операторы ветвления (if, if...else, switch (case), goto), цикла (while, do...while, for).
Мои размышления о "косметики" программ можно найти здесь.
Go to the top of the page
 
+Quote Post
AVNN
сообщение Oct 2 2006, 08:22
Сообщение #41


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 28-09-06
Из: Минск
Пользователь №: 20 776



Что касается AVR и goto, то при использовании оптимизации кода по размеру, этот оператор опасно использовать. При использавании Cross Call могут действительно возникнуть проблемы со стеком. Так что лучше не рисковать! Можно просто поэкпериментировать, компилируя программу с разными настройками оптимизации - хороший код должен работать в любом случае.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Oct 2 2006, 08:35
Сообщение #42


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(AVNN @ Oct 2 2006, 11:22) *
Что касается AVR и goto, то при использовании оптимизации кода по размеру, этот оператор опасно использовать. При использавании Cross Call могут действительно возникнуть проблемы со стеком. Так что лучше не рисковать! Можно просто поэкпериментировать, компилируя программу с разными настройками оптимизации - хороший код должен работать в любом случае.

А какие тут могут бть проблемы?
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 2 2006, 10:12
Сообщение #43


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Всякий овощ полезен будучи приготовленным надлежащим образом. ©
Go to the top of the page
 
+Quote Post
ValBag
сообщение Oct 24 2007, 06:19
Сообщение #44


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

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



Во всех наставлениях по СИ для МК "...настоятельно не рекомендуется использовать оператор безусловного перехода goto, т.к. он затрудняет понимание программ и возможность их модификаций...". В то же время другими операторами СИ не всегда удобно осуществлять переходы, а в ассемблере применение команд jmp и rjmp ограничений почти нет.
Для примера в программе "кодовый замок" из книги Белова А.В., в небольшом тексте программы на CИ в модуле main 7 переходов. И все работает нормально. Может быть, кто то потвердит вводное утверждение и покажет как надо на приложенном тексте.
Прикрепленные файлы
Прикрепленный файл  Zamok.txt ( 4.23 килобайт ) Кол-во скачиваний: 84
 
Go to the top of the page
 
+Quote Post
bodja74
сообщение Oct 24 2007, 06:40
Сообщение #45


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



В ассемблере вообще ни в чем ограничений нет smile.gif

Просто для себя нужно уяснить простую вещь,если вы перейдете на подпрограмму по jmp или rjmp
(тот же GOTO) ,вы из нее уже не вернетесь smile.gif
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 03:41
Рейтинг@Mail.ru


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