Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Вниз

как-то видел на этом форуме...   Найти похожие ветки 

 
марсианин ©   (2004-12-19 20:49) [120]


> 2GrayFace ©   (19.12.04 08:56)
> Ага, заменив это на goto, который - тоже, типа, дурной тон.

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

по поводу виртуальных функций в конструкторе. я попробовал, все работает на ура (VS 7). функция вызывается, причем та, которая и должна.. т.е. вызов полиморфный
надо тогда еще dynamic_cast испытать

а почему Страуструп не рекомендует, причина стандартная:
"результат зависит от реализации".
к тому же, как сам говорит Страуструп его рекомендации (а равно как и нерекомендации) никогда не являются категорическими.

по поводу других случаев goto/return/break/continue я думаю так: если хочется и знаешь, что делаешь - пиши!
return/break/continue - в циклах хочется писать часто, а вот про goto вспоминаю довольно редко...


 
Anatoly Podgoretsky ©   (2004-12-19 20:52) [121]

Если жизнь на Марсе?
Жизни может и нет, но программисты есть.


 
begin...end ©   (2004-12-19 21:29) [122]

> [120] марсианин ©   (19.12.04 20:49)

> по поводу других случаев goto/return/break/continue я думаю
> так: если хочется и знаешь, что делаешь - пиши!

И я. Того же мнения.

Кому интересно - вот две старые ветки с обсуждениями сабжа (нашёл в архиве клиента):

http://forever_young.russian.ru/goto1.htm

http://forever_young.russian.ru/goto2.htm


 
КаПиБаРа ©   (2004-12-20 07:08) [123]

GrayFace ©   (19.12.04 8:56) [119]
function ...
label done;
begin
if ... then goto done;
...
if ... then goto done;
...
done:
какие-то финальные действия
end;
Все абсолютно прозрачно - почти exit, но с какими-то действиями напоследок.


Никогда не было необходимости писать использовать в таких конструкциях оператор GOTO. Всегда обходился оператором Case of или if ... then ...Exit


 
GrayFace ©   (2004-12-20 14:01) [124]

марсианин ©   (19.12.04 20:49) [120]
нет. я имел ввиду принудительный выход из try..finally вообще
а избежать можно, например, возбудив исключение.. и перехватив его за блоком. но это сложнее.
я все больше прихожу к выводу, что это нормально (принудительный выход).

Не понял. Можешь код примерный показать?

КаПиБаРа ©   (20.12.04 7:08) [123]
А я встретился дважды в двух похожих случаях: строчный калькулятор и парсер вырожения по любой спецификации (сейчас пишу). Я имею ввиду не то, что делается через case, а необходимость в нескольких местах делать определенные действия и тут же выходить. Несколько проверок в абсолютно разных местах. Самое удобное и оптимальное в таких случаях - писать goto.


 
КаПиБаРа ©   (2004-12-21 07:18) [125]

Только что написал функцию с оператором goto
 // Заполнение массива положительными не повторяющимися номерами из списка
 procedure FillArrDatRec(ar: TArrDatRec; sl: TStrings);
 var
   i, k, n, lgh: Integer;
   label Next_Num;
 begin
   lgh := 0;
   for i := 0 to sl.Count-1 do
   begin
     n := StrToIntDef(sl[i], -1);
     if n > 0 then
     for k := 0 to lgh-1 do
     begin
       if ar[k].NSign = n then goto Next_Num
     end;
     Inc(lgh);
     SetLength(ar, lgh);
     ar[lgh].NSign := n;
   Next_Num:
   end;
 end;


и не умер :)))


 
KSergey ©   (2004-12-21 07:47) [126]

> [125] КаПиБаРа ©   (21.12.04 07:18)

Я, конечно, прошу прощения, но разве Continue уже не в моде? Или я не оценил шутку?


 
begin...end ©   (2004-12-21 07:56) [127]

> [125] КаПиБаРа ©   (21.12.04 07:18)

Ну это уже перебор, ИМХО. К тому же у Вас там есть выход за границы массива.

Я бы сделал так:

procedure FillArrDatRec(ar: TArrDatRec; sl: TStrings);
var
 I, K, N: Integer;
begin
  for I := 0 to sl.Count - 1 do
  begin
    N := StrToIntDef(sl[I], -1);
    if N > 0 then
      for K := 0 to High(ar) do
        if ar[K].NSign = N then Continue;
    SetLength(ar, Length(ar) + 1);
    ar[High(ar)].NSign := N
  end
end.


 
КаПиБаРа ©   (2004-12-21 08:24) [128]

begin...end ©   (21.12.04 7:56) [127]
Точно там еще куча ошибок. Я свои исправил, а Вы?
 // Заполнение массива положительными не повторяющимися номерами из списка
 procedure FillArrDatRec(var ar: TArrDatRec; sl: TStrings);
 var
   i, k, n, lgh: Integer;
   label Next_Num;
 begin
   lgh := 0;
   for i := 0 to sl.Count-1 do
   begin
     n := StrToIntDef(sl[i], -1);
     if n > 0 then
     begin
     for k := 0 to lgh-1 do
       if ar[k].NSign = n then continue;
     Inc(lgh);
     SetLength(ar, lgh);
     ar[lgh-1].NSign := n;
     end;
   Next_Num:
   end;
 end;


 
КаПиБаРа ©   (2004-12-21 08:25) [129]

Блин :))
     for k := 0 to lgh-1 do
       if ar[k].NSign = n then goto Next_Num;


 
КаПиБаРа ©   (2004-12-21 08:52) [130]

Заразная эта вещь - Goto. Чуть опять его не использовал. Хорошо хватило воли удержаться от этого.
:)))


 
Sandman25 ©   (2004-12-21 09:11) [131]

for k := 0 to lgh-1 do
      if ar[k].NSign = n then continue;
следует оформить в виде function IsInArray: Boolean и никаких goto не понадобится.


 
КаПиБаРа ©   (2004-12-21 09:26) [132]

Sandman25 ©   (21.12.04 9:11) [131]
Да понятно что есть много способов избежать goto. Если бы не было этой ветки я бы так и сделал.


 
begin...end ©   (2004-12-21 11:47) [133]

> [128] КаПиБаРа ©   (21.12.04 08:24)

Да, я ошибся в [127] насчёт Continue (спешил в институт :-) ).

Тогда можно так:

procedure FillArrDatRec(ar: TArrDatRec; sl: TStrings);
var
I, K, N: Integer;
begin
 for I := 0 to sl.Count - 1 do
 begin
   N := StrToIntDef(sl[I], -1);
   if N > 0 then
     for K := 0 to High(ar) do
       if ar[K].NSign = N then
         Break
       else if K = High(ar) then
       begin
         SetLength(ar, Length(ar) + 1);
         ar[High(ar)].NSign := N
       end
 end
end.


Правда, это не самый лучший вариант в смысле оптимальности.

В общем, я бы скорее предпочёл [131] Sandman25 ©   (21.12.04 09:11), или вместо вложенного for"а использовал while, но в последнем случае для повышения производительности потребовалось бы определять длину массива перед выполнением цикла, т.е. нужна была бы дополнительная переменная.



Страницы: 1 2 3 4 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.74 MB
Время: 0.043 c
3-1102521427
DimonNew
2004-12-08 18:57
2005.01.09
DBCheckBox


1-1103610892
Mate_ru
2004-12-21 09:34
2005.01.09
Обновление Image


1-1103844001
Tine
2004-12-24 02:20
2005.01.09
Calendar


1-1103696858
ceval
2004-12-22 09:27
2005.01.09
Подскажите как програмно создать папку с таким именем 20041222


4-1100691991
H.A.Z.A.R.D.
2004-11-17 14:46
2005.01.09
How Create a System Service [Install Service] (создать службу)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский