Форум: "Потрепаться";
Текущий архив: 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