Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.58 MB
Время: 0.031 c
14-1094040541
Димитрий
2004-09-01 16:09
2004.09.19
Улыбнитесь


14-1094029648
miwa
2004-09-01 13:07
2004.09.19
"Мобильная революция" началась ;o))


1-1093895732
d_oleg
2004-08-30 23:55
2004.09.19
Цвет TPanel под WinXP с включёнными visual styles


1-1094403523
ilnarab
2004-09-05 20:58
2004.09.19
как узнать сколько дней прошло, например, с 12.11.1956 года?


14-1093973736
Jus
2004-08-31 21:35
2004.09.19
Сон замучал!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский