Форум: "Потрепаться";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Внизоператор goto Найти похожие ветки
← →
DimKa © (2004-09-01 10:58) [0]Тут с коллегой вышел спор однако.
Тема такая - в процедуре использовал оператор goto.
Я ему сказал, что данные структуры не желательны.
В ответ получил - да, работает и ладно, а на код все равно смотреть никто не будет.
Мне это не понравилось, да и непонял я в его коде кое-чего и переписал код. Он обиделся, вроде как писал зря что-ли, мучался.
Может я не прав?
Чем чреваты данные конструкции?
← →
passlight © (2004-09-01 11:01) [1]Сложнее будет потом разбираться в коде.
← →
Ozone © (2004-09-01 11:02) [2]Ты прав. Гнать надо таких "програмистов"...
← →
peypivo © (2004-09-01 11:04) [3]Как такого "коллегу" на работу приняли?
← →
Sergey_Masloff (2004-09-01 11:04) [4]Если четко понимать для чего нужен goto и чем он лучше других методов именно в этом конкретном месте - его применение ИМХО допустимо. Хотя в 99.99999% случаев использование этого оператора не привносит ничего хорошего.
С другой стороны любой ассемблерный джамп это и есть goto так что хоронить старичка рано ;-)
← →
Плохиш © (2004-09-01 11:04) [5]И будет ветка на 150 постов, и будет длится обсуждение в течении 2 дней, и будут кипеть здесь религиозные страсти.
← →
Dok_3D © (2004-09-01 11:07) [6]Гнать, конечно, не нужно, но присмотреться повнимательнее будет не лишним. В конце концов - люди склонны к самообучению. Тем более, если корпоративный стиль обяжет - то никуда ему не деться.
← →
КаПиБаРа © (2004-09-01 11:09) [7]Приведи код с оператором Goto. Интересно посмотреть
← →
DimKa © (2004-09-01 11:11) [8]
> Dok_3D © (01.09.04 11:07) [6]
Нет никакого корпоративного стиля, госконтора.
Спасибо всем за моральную поддержку.
← →
Jeer © (2004-09-01 11:13) [9]Недавно ушедший из жизни Эдсгер Дейкстра - основатель Algol, ввел термин "структурное" программирование.
Он обосновал, что нужны всего три логические структуры: sequence (следование), selection (ветвление) и iteration (цикл).
И без goto можно вполне обойтись.
← →
Knight © (2004-09-01 11:14) [10]У нас за такие goto с лабораторных выгоняли... а вообщее, его использование - дурной тон...
← →
DimKa © (2004-09-01 11:14) [11]
> КаПиБаРа © (01.09.04 11:09) [7]
Compare: for n := 0 to k - 1 do
begin
if OffY[k] = OffY[n] then
begin
////
OffY[k] := 6144 * Round(Random(ImH {- 1}));
goto Compare;
end;
end;
Ничаго интересного - задача заполнения массива случайными числами без повтора значений.
← →
Ega23 © (2004-09-01 11:16) [12]While?
← →
Dok_3D © (2004-09-01 11:17) [13]Нет никакого корпоративного стиля ...
Во избежании ситуции с goto, нужно его(стиль) утвердить :))
И не будете время в будущем терять на такие мелочи.
← →
Ega23 © (2004-09-01 11:17) [14]А сам я довольно часто goto использую. Правда в T-SQL... :о)
← →
DimKa © (2004-09-01 11:18) [15]
> Ega23 © (01.09.04 11:16) [12]
> While?
repeat
until
← →
}|{yk © (2004-09-01 11:19) [16]Когда-то на 3 курсе по защите информации генерил таблицу, где нет повторений ни в строках, ни в столбцах
randomize();
for (int i=0;i<ShifrGrid->ColCount;i++)
{
for (int j=1;j<ShifrGrid->RowCount;j++)
{
bool insert=false;
while(!insert)
{
int rnd=random(3*n);
bool not=false;
for (int k=0;k<ShifrGrid->RowCount;k++)
{
if(StrToIntDef(ShifrGrid->Cells[i][k],-1)==rnd)
not=true;
}
for (int l=0;l<ShifrGrid->ColCount;l++)
{
if(StrToIntDef(ShifrGrid->Cells[l][j],-1)==rnd)
not=true;
}
if(!not){
ShifrGrid->Cells[i][j]=rnd;
insert=true;}
}
}
}
← →
Ega23 © (2004-09-01 11:21) [17]DimKa © (01.09.04 11:18) [15]
Можно и так.
← →
Sergey_Masloff (2004-09-01 11:21) [18]Jeer © (01.09.04 11:13) [9]
>Недавно ушедший из жизни Эдсгер Дейкстра - основатель Algol, >ввел термин "структурное" программирование.
>Он обосновал, что нужны всего три логические структуры: >sequence (следование), selection (ветвление) и iteration (цикл).
>И без goto можно вполне обойтись.
Да конечно можно. Но иногда с goto - эффективнее (повторю ОЧЕНЬ редко). Противного уважаемый Дейкстра не доказывал насколько я знаю. Кстати для передвижения из точки А в точку Б совершенно не нужен самолет или автомобиль - все прекрасно знают что для этого достаточно двух ног (и даже ползком можно).
Да, GOTO можно заменить всегда. Но есть 100% уверенность что это НУЖНО делать всегда? У меня нет.
← →
Dmitriy O. © (2004-09-01 11:24) [19]Goto Класная вещь. Позволяющая экономить и код и время.
Я сам часто его использую.
← →
}|{yk © (2004-09-01 11:26) [20]Оно и видно :). Сколько AV было в автонагревателе?
← →
SergP. (2004-09-01 11:26) [21]Хм... А я даже себе не могу представить, что можно такого написать на паскале что использование goto сделает прогу проще. Ни разу даже не пробовал его использовать на паскале, хотя когда-то давно начинал со старого бейсика, где без goto не обойтись...
← →
Думкин © (2004-09-01 11:30) [22]> SergP. (01.09.04 11:26)
Сейчас есть Break и Continue. А когда их не было? Конечно и тогда можно было без него, но иногда уж очень лениво.
← →
DimKa © (2004-09-01 11:32) [23]Если кому надо - код заполнения массива без повторов:
Randomize;
SetLength(LostPakets,KolUpak);
LostPakets[0] := Random(Npackets);
for i := 1 to KolUpak-1 do
repeat
NewZn := Random(Npackets);
ZnEx := true;
for j := 0 to i - 1 do
if LostPakets[j] = NewZn then
ZnEx := false;
if ZnEx then
LostPakets[i] := NewZn;
until ZnEx;
← →
Vovchik_A © (2004-09-01 11:32) [24]2Dmitriy O. © (01.09.04 11:24) [19]
Дадад, автосхему видели :)
2DimKa ©
repeat
...
...
...
until
И будет твоему коллеге счастье. А то руки отрубят по самые уши когда-нибудь
← →
default © (2004-09-01 11:36) [25]"а на код все равно смотреть никто не будет."
это как-то наплевательски вот если бы он тебе объяснил почему он выбрал именно Goto, а так...
← →
NailMan © (2004-09-01 11:37) [26]SergP.
Function TUTGUI.Show_AudioOptionsMenu:Integer;
label _Start,_Exit;
Procedure UpdateVariablesStates;
begin
TMainCheckBox(Menu.GetControlByName("Use3DHardwareSoundCheckBox")).Checked:=Use3DHardwareSound;
TMainCheckBox(Menu.GetControlByName("UseSpatialSamplesCheckBox")).Checked:=UseSpatialSamples;
TMainCheckBox(Menu.GetControlByName("ReverbForMusicCheckBox")).Checked:=UseReverbMusic;
TMainScrollBar(Menu.GetControlByName("MusicVolumeBar")).Position:=Round((MusicVolume*16)/100);
TMainScrollBar(Menu.GetControlByName("SfxVolumeBar")).Position:=Round((GUISfxVolume*16)/100);
TMainScrollBar(Menu.GetControlByName("SoundVolumeBar")).Position:=Round((SfxVolume*16)/100);
TMainScrollBar(Menu.GetControlByName("SpeakVolumeBar")).Position:=Round((SpeechVolume*16)/100);
end;
begin
Menu:=TMenuForm.Create;
Menu.LoadMenu("AudioOptions_Menu.cfg","[AudioOptions_Menu]");
Menu.Caps.Info:=Menu.Buttons[menu.Items.ButtonIndex].Info;
TMainScrollBar(Menu.GetControlByName("MusicVolumeBar")).Count:=16;
TMainScrollBar(Menu.GetControlByName("SfxVolumeBar")).Count:=16;
TMainScrollBar(Menu.GetControlByName("SoundVolumeBar")).Count:=16;
TMainScrollBar(Menu.GetControlByName("SpeakVolumeBar")).Count:=16;
UpdateVariablesStates;
Menu.Fade(FADE_IN);
//Основной цикл меню
_Start:
REPEAT
if PeekMessage(Msg,Handle,0,0,PM_REMOVE) then begin TranslateMessage(Msg);DispatchMessage(Msg);end;
Menu.Update; //Рендерим меню
if DeveloperModeEnable and DevelopEnableConsole and UTConsole.Enabled then
Result:=UTConsole.execute
else
result:=Menu.ReadInput;
UNTIL Result in[MENU_EXITTING,EC_RETURN,EC_ESCAPE,EC_TOGGLECONSOLE,EC_CHECKBOXCHECKED,EC_SCROLLBARCHANGED];
//Выбор пост-действий на событие
Case Result of
MENU_EXITTING : Goto _Exit;
EC_ESCAPE : Begin Result:=MENU_OPTIONSMENU; Goto _exit; End;
EC_TOGGLECONSOLE : UpdateVariablesStates;
EC_RETURN : begin
if Menu.GetNameActivatedControl(GUIID_BUTTON)="CloseButton" then
Begin Result:=MENU_OPTIONSMENU; Goto _exit; End;
end;
EC_CHECKBOXCHECKED: begin
If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="Use3DHardwareSoundCheckBox" then
begin Use3DHardwareSound:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="UseSpatialSamplesCheckBox" then
begin UseSpatialSamples:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="ReverbForMusicCheckBox" then
begin UseReverbMusic:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
end;
End;
Goto _Start;
_Exit:
Menu.Fade(FADE_OUT);
Menu.Free;
Menu:=nil;
end;
Этот пойдет?
Это "TForm" моего игрового GUI. С Goto было сделать проще.
---
WBR, NailMan aka 2:5020/3337.13
← →
Игорь Шевченко © (2004-09-01 11:38) [27]
> Этот пойдет?
В recycle bin
← →
NailMan © (2004-09-01 11:40) [28]Игорь Шевченко ©
Чем же?
---
WBR, NailMan aka 2:5020/3337.13
← →
Ega23 © (2004-09-01 11:42) [29]
While true do begin
REPEAT
if PeekMessage(Msg,Handle,0,0,PM_REMOVE) then begin TranslateMessage(Msg);DispatchMessage(Msg);end;
Menu.Update; //Рендерим меню
if DeveloperModeEnable and DevelopEnableConsole and UTConsole.Enabled then
Result:=UTConsole.execute
else
result:=Menu.ReadInput;
UNTIL Result in[MENU_EXITTING,EC_RETURN,EC_ESCAPE,EC_TOGGLECONSOLE,EC_CHECKBOXCHECKED,EC_SCROLLBARCHANGED];
//Выбор пост-действий на событие
Case Result of
MENU_EXITTING : Break;//Goto _Exit;
EC_ESCAPE : Begin Result:=MENU_OPTIONSMENU; Break;End;
EC_TOGGLECONSOLE : UpdateVariablesStates;
EC_RETURN : begin
if Menu.GetNameActivatedControl(GUIID_BUTTON)="CloseButton" then
Begin Result:=MENU_OPTIONSMENU; Break;End;
end;
EC_CHECKBOXCHECKED: begin
If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="Use3DHardwareSoundCheckBox" then
begin Use3DHardwareSound:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="UseSpatialSamplesCheckBox" then
begin UseSpatialSamples:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="ReverbForMusicCheckBox" then
begin UseReverbMusic:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
end;
End;
end;
?
← →
VID © (2004-09-01 11:43) [30]DimKa © (01.09.04 11:14) [11]
Ихмо, простая рекурсия с условным вызоым.
Тут меня заинтересовало, если не секрет конечно, какую зарплату получает автор приведённого тобою кода ?
← →
DimKa © (2004-09-01 11:46) [31]
> VID © (01.09.04 11:43) [30]
Согласно должности инженера 2-ой категории.
← →
NailMan © (2004-09-01 11:50) [32]Ega23 ©
Вобщем-то правильно, но с GoTo по смыслу было проще понять куда же я попаду после goto чем в вышеприведенном коде.
---
WBR, NailMan aka 2:5020/3337.13
← →
VID © (2004-09-01 11:50) [33]DimKa © (01.09.04 11:46) [31]
А это сколько ?
← →
Ega23 © (2004-09-01 11:56) [34]NailMan © (01.09.04 11:50) [32]
Не уверен, как раз мне проще так, как я написал. ИМХО, дело вкуса.
Могу привести пример:
Делаем разбор строки. Case применить нельзя. Возможных значений, например, около 100. Чаще всего встречаются первые 2.
if UpperCase(Str)="AAA" then begin DoSmthng1; Goto Fin; end;
if UpperCase(Str)="BBB" then begin DoSmthng2; Goto Fin; end;
if UpperCase(Str)="CCC" then begin DoSmthng3; Goto Fin; end;
...................................
if UpperCase(Str)="N" then DoSmthngN;
Fin:
← →
КаПиБаРа © (2004-09-01 11:59) [35]DimKa © (01.09.04 11:32) [23]
У твоего товарища код был интереснее, оригинальнее, быстрее. Зря ты его переписал.
← →
Плохиш © (2004-09-01 12:06) [36]
> Ega23 © (01.09.04 11:56) [34]
> if UpperCase(Str)="AAA" then DoSmthng1
> else if UpperCase(Str)="BBB" then DoSmthng2
> else if UpperCase(Str)="CCC" then DoSmthng3
> else
> ...................................
> if UpperCase(Str)="N" then DoSmthngN;
Следуюший вопрос ;-)
← →
Ega23 © (2004-09-01 12:08) [37]Плохиш © (01.09.04 12:06) [36]
Логично! :о)
← →
Jeer © (2004-09-01 12:14) [38]Как вариант:
x := round(1000*Random);
for j:=0 to High(Y) do begin
for i:=0 to High(Y) do
if Y[i] = x then
while Y[i] = x do
x := round(1000*Random);
Y[j] := x;
end;
А в коде DimKa © (01.09.04 11:14) [11]
ошибка или он неполный.
← →
Думкин © (2004-09-01 12:18) [39]А не проще заполонить массив с возрастанием, а потом перемешать?
← →
Jeer © (2004-09-01 12:20) [40]Ega23 © (01.09.04 11:56) [34]
Case со строками можно делать, но с умом:)
хеш или так:
function StrCase(Selector: string; StrList: array of string): integer;
var
i: Integer;
begin
Result := -1;
for i := 0 to High(StrList) do begin
if Selector = StrList[i] then begin
Result := i;
Break;
end;
end;
end;
case StrCase(StringToTest, ["First", "Second", "Third"]) of
0: ShowMessage("1: " + s);
1: ShowMessage("2: " + s);
2: ShowMessage("3: " + s);
else
ShowMessage("else: " + s);
end;
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.036 c