Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ

FAQ Туториалы и часто задаваемые вопросы

Закрытая тема
 
Опции темы
Старый 04.09.2005, 22:08   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Радость

Рано или поздно возникает вопрос об оправданности его использования. ГОТО - оператор безусловного перехода - порождение ассемблера (где он необходим), переполз вместе с некоторыми атавизмами в языки высокого уровня. Конечно, ваш знакомый кодер Вася скажет - "egal! не заморачивайся!". Но вот, что-то от известный программистов я таких откровений не слыхивал. Т.е. Вы, конечно можете возомнить себя Биллом Гейтсом и плодить, подобно ему, в своей программе ошибку на ошибке, раболепно покланяясь людской лени и предрассудкам.
Я лишь приведу простенькие примеры, которые наглядно покажут, что, юзая ГОТО Вы не просто, поступаете необуманно - Вы отстраняете себя от понимания логики программы.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Старый 04.09.2005, 22:09   #2
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
#1
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
{
	char t[100];
f:
	cin>>t;
	if( stricmp(t,"")==0) {goto f;}


}
простейший код на С++ - вроде всё красиво и просто, далее...
(кстати, спросите тем времен у Васи - писал ли он, что-нибудь сложнее, чем пример №1)

#2
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
{
	int a=1;
	int b=2;
	bool key=1;
	if(key==1){goto f;}
 int x=a;
 a=b;
 b=x;
	f:
 cout<<a<<" "<<b;
}
Данный пример чуть по-сложнее. Если флаг key не равен 1 - поменять значения переменных a и b местами.
И как Вы думаете: что скажет нам MSVC++?
error C2362: initialization of 'x' is skipped by 'goto f'
see declaration of 'x'
Error executing cl.exe.
1 error(s)
Т.е. временную переменную X необходимо закинуть повыше - до вызова оператора ГоТо. Теперь становится понятно, откуда у Васи Pascal`евские замашки инициализировать всё в одном месте.
Теперь представьте - такие танцы с временными переменными в большой программе...

Ещё, я обмолвился о понимании логики программы - так вот. Как описать процесс наполнения ведра водой "до краёв"?
Нормальный человек:
"Наливать, пока ведро не наполнится на 100%"
while get_p(vedro)!=100
dobavit_vodi(vedro)
wend
или
"Наливать пока не останется не занятого объёма"
while 100-get_p(vedro)>0
dobavit_vodi(vedro)
wend
ну или даже
"Наливать воду. Если ведро полное - прекратить"
while true
dobavit_vodi(vedro)
if get_p(vedro)==100 exit
wend
Логика с ГоТо:
"Налить воды. Если оно не полное то, повторить последнее действие"
Про многоступенчатые переходы, которые иначе как кошмарным сном не назовёшь, я вообще промолчу - представьте хотя бы, что каждому циклу Вы присваиваете уникальное имя. А блок-схема на готоах - это вообще абстракционизм.

Вчера ты был за goto,
сегодня - против функций
завтра - против массивов и типов
послезавтра - против мат.операций
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Сообщение было полезно следующим пользователям:
Phantom (08.04.2009)
Старый 04.09.2005, 22:16   #3
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Сообщение

Сразу хочу сказать, я не прямотаки ЗА ГОТО, я против его противников, а теперь поехали

1. на счет ошибок программ с гото, это не из-за использования гото, это из-за умного программиста, могу привести кучу примеров ошибочных программ и с некорректной логикой и без использования гото...

2. цитата:
"Наливать воду. Если ведро полное - прекратить". Логика с ГоТо: "Налить воды. Если оно не полное то, повторить последнее действие"
Хотелось бы узнать, почему ты считаешь вторую логическую ситуацию хуже первой, неужели только потому, что такая логика конкретно тебе кажется нагляднее? с машинной точки зрения хоть первый случай, хоть второй будут обрабатываться одинаково...

3. то, что компиляторы глючно обрабатывают некоторые операторы, не значит, что сами операторы плохи...

4. коль уж вспомнили про ассемблер, давайте рассмотрим, что-же делает машина при вызове гото (в сравнении). (поскольку мы работаем в 32битном защищенном режиме, беру скоростя на дальние переходы, более 64 кб)

4а. оператор Jmp (гото который), заносит в регистр EIP новое значение тем самым провоцирует выполнение команды с другого адреса... работает за 3 такта на пентиуме 1 (для сравнения возьмем пент первый)

4б. оператор Call (Gosub который), заталкивает в стек текущий EIP и переходит по указанному адресу, при команде Return из стека достается это адрес и делается на него переход.. call работает за 4 такта, возврат 4 такта, итого восемь тактов первого пенька

4в. оператор Enter (вызов процедуры), создает стековый кадр нужного (заданного компилятором) раздела... помещает в новый стек адрес нормального стека и переходит по указанному адресу, при возврате восстанавливается адрес старого стека, удаляется новый, и делается переход назад таким образом сохраняются все переменные. дак вот команда входа выполдняется за 15 тактов, выход из процедуры три такта итого 18 тактов работы процессора

4г. циклы, в машинных кодах предусмотрены циклы с постусловием loop называются, дак вот, такой цикл уменьшает значение регистра ECX на один и если не ноль переходит на метку (там есть несколько условий в которых проверяется флаг равентства и флаг нуля, итого 4 условия). такая команда выполняется за 8 тактов если нужен переход и 7 тактов если переход не нужен...

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

5. напомню для тех, которые если определенные две строчки повторяются в коде делают сразу процедуру... для таких слчаев в НОРМАЛЬНЫХ языках программирования предусмотрены макроподстановки.

6. еще про возврат значений, хорошо если язык позволяет вернуть несколько значений из процедуры, а если нет?? делать глобальные переменные и присваивать значение в процедуре... а смысл тогда самой процедуры??

7. а путаница в переменных, когда не знаешь в каком месте программы какая переменная присутствует а какая нет и какое в ней значение если имя переменной юзается в разных процедурах для хранения разных значений...

8. я если чесно признаться всегда путаюсь, цикл с предусловием работает "пока не", а цикл с постусловием работает типа "если", дак вот я всегда путаюсь какое условие писать на не или просто... а при юзании гото, таких проблем нет, все ясно как день...

вообще мне кажется, это дело вкуса о котором как говорится не спорят..
__________________
Как минимум я помог многим (с)
(Offline)
 
Старый 04.09.2005, 22:17   #4
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
5- такая штука на С++ называется in-line функцией (если я тебя правильно понял)
7- как раз про гото
8- вот именно, я знаю откуда ветер дует переучиваться лень.
Ладно, проехали - но проблему освятить на форуме надо было
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Старый 05.09.2005, 21:55   #5
alcosholik
 
Сообщений: n/a
Согласен с предыдущим автором насчет восьмого пункта - дело привычки, просто попрактиковаться нужно.

Вообще goto сильно путает в больших проектах, где куча кода. Там метка может находится далеко от самого goto. В этом случае придется потратить время на поиск метки. С функциями же проще, так как всех их можно запихнуть в конец программы и в нужный момент сразу найти.

Я не считаю, что goto - это ламерство. Но со временем его смерть кажется неизбежной.
 
Старый 06.09.2005, 01:06   #6
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Originally posted by alcoSHoLiK@Sep 5 2005, 07:55 PM
Я не считаю, что goto - это ламерство. Но со временем его смерть кажется неизбежной.
Както помнится Билли Гейтс говорил, что ассемблер в ближайшие годы должен умереть за ненадобностью... че-то не умерает он и врядли в ближайшие пару десятков лет умрет (пока нейрокомпы не изобретут)... и вместе с ним ГОТО будет еще дооолго жить и его будут юзать, и будут вестись споры о нужности его использования, и всегда эти споры будут приводить никчему... юзающие гото так и будут его юзать, а неюзающие и далее не будут позволять себе такое "ламерство"...
__________________
Как минимум я помог многим (с)
(Offline)
 
Старый 06.09.2005, 18:53   #7
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Originally posted by alcoSHoLiK@Sep 5 2005, 07:55 PM
Я не считаю, что goto - это ламерство. Но со временем его смерть кажется неизбежной.
Както помнится Билли Гейтс говорил, что ассемблер в ближайшие годы должен умереть за ненадобностью... че-то не умерает он и врядли в ближайшие пару десятков лет умрет (пока нейрокомпы не изобретут)... и вместе с ним ГОТО будет еще дооолго жить и его будут юзать, и будут вестись споры о нужности его использования, и всегда эти споры будут приводить никчему... юзающие гото так и будут его юзать, а неюзающие и далее не будут позволять себе такое "ламерство"...
Про бессмысленность споров - это ты прав (заметка в FAQ - то не спор, а дискуссия, призванная объективно показать начинающим ту или иную проблему). Однако уверждать, что жив АСМ, это тоже самое, что и говорить о латыни, как о действующим языке - хотя официально он сичтается мёртвым. Всегда найдётся человек, знающий оправданность использования асма, да и латынь не от нефиг делать учат.
Иными словами термин "жив" здесь надо юзать весьма осторожно.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Старый 07.09.2005, 00:07   #8
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Originally posted by impersonalis@Sep 6 2005, 04:53 PM
Иными словами термин "жив" здесь надо юзать весьма осторожно.
Я готов юзать это во весь голос и с гордостью , покажите мне человека который бы без существования асма запустил-бы комп! Это просто его сейчас не юзают в программировании...


а как-же вирусы?? их пишут кучами, если не взять макровирусы и всякие трояны начинающих на VB, то их пишут на чистом асме...

АСМ Жив и будет жить!
__________________
Как минимум я помог многим (с)
(Offline)
 
Старый 07.09.2005, 00:58   #9
alcosholik
 
Сообщений: n/a
АСМ Жив и будет жить!
Никто и не говорил "Смерть АСМу"

Велась дискуссия о целесообразности использования GoTo.
 
Старый 07.09.2005, 22:21   #10
jimon
 
Сообщений: n/a
вы скажите разроботчкикам процесоров - смерть гото
они вам покажут "смерть"
asm и гото вечны ... потомучто обектное программирование прямо так встроить в процессор нельзя... как нестарайся

а вот то что спорить об гото - глупо
важен результат а не как его добились
 
Сообщение было полезно следующим пользователям:
Phantom (08.04.2009)
Старый 10.10.2005, 06:36   #11
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Originally posted by jimon@Sep 7 2005, 08:21 PM
а вот то что спорить об гото - глупо
важен результат а не как его добились
это ты погорячился... если бы было не важно "как", то этот форум и не родился бы..
__________________
Как минимум я помог многим (с)
(Offline)
 
Старый 10.10.2005, 19:03   #12
jimon
 
Сообщений: n/a
обычный пользователь windows врятле думает как работает ядро и драйверная система

уже тем более он врятли знает как добится выхода в ring 0, как остановить ядро... как получать всякие там дельта-смещения и прочее

результат важен для конечных пользователей
coding_for_fun я не щитаю :o''
 
Старый 10.10.2005, 20:21   #13
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Originally posted by jimon@Oct 10 2005, 05:03 PM
обычный пользователь windows врятле думает как работает ядро и драйверная система

уже тем более он врятли знает как добится выхода в ring 0, как остановить ядро... как получать всякие там дельта-смещения и прочее

результат важен для конечных пользователей
coding_for_fun я не щитаю :o''
и кстати не нужно путать ООП и программирование в Блице... я не вижу в блице ООП.

ага.. как пример если сравнить программирование с одеванием штанов, можно штаны разрезать, покусочкам к себе приложить и снова сшить, а можно просто одеть... теперь компы развились до такой степени что и первым способом и вторым можно будет одеть до 100 штанов в секунду, но все равно не нужно забывать в чем заключается искусство программирования... не в зарабатывании денег (не результат важен), а в грамотном коде(как его достигли)!
__________________
Как минимум я помог многим (с)
(Offline)
 
Старый 10.10.2005, 22:18   #14
jimon
 
Сообщений: n/a


конешно сто штанов ето круто... да круто... штаны ето круто (как говорила масяня про печать )


При регистрации на форуме ты поставил галочку "Я согласен" под правилами форума. Там написано:
...
На форуме запрещено:
отправка сообщений не по содержанию форума/темы
...
Последнее предупреждение.
 
Старый 13.11.2005, 03:42   #15
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Смущение

Вот провёл тестик: что быстрее - цикл или переход по GoTo
ITER=1000000
;====
time1=MilliSecs()
i=ITER
.a
i=i-1
If i>0 Goto a
time1=MilliSecs()-time1
;===
time2=MilliSecs()
For i=ITER To 1 Step -1
Next
time2=MilliSecs()-time2
;===
Print "Goto "+time1
Print "for "+time2
WaitKey()
End
Интересно - попробуйте.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Закрытая тема


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вылетает при использовании ьольшинства библиотек GanGSISoft MidletPascal 5 27.10.2009 00:33
GOTO Slepetc 2D-программирование 11 23.04.2009 20:28
Невозможно включть полноекранный режим при использовании Game Api Kurdt Основной форум 12 04.06.2007 23:33


Часовой пояс GMT +4, время: 04:49.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com