Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.19;
Скачать: CL | DM;

Вниз

оператор 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;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.053 c
1-1094146616
bloodman
2004-09-02 21:36
2004.09.19
Почему в длл не работает try except??


14-1093588857
nasty
2004-08-27 10:40
2004.09.19
как послать другому компу messagebox по сетке,


1-1093402316
Александр1
2004-08-25 06:51
2004.09.19
Разделение строчек


3-1092958226
Karburator
2004-08-20 03:30
2004.09.19
case


14-1093920830
КаПиБаРа
2004-08-31 06:53
2004.09.19
Помогите скачать файл