Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > корректность кода


Автор: Cetus 23.3.2005, 21:22
возник вопрос, является ли код корректным?
Код

try
  for i := 0 to n do something;
except
  showmessage(inttostr(i));
end;


если при i=k, (0<k<n) возникнет исключение, то в секции except значение i будет то же самое что и в секции try
(в т.ч. при граничных значениях)?

На тестах проблем не было, но компилятор делфи ругается, что значение i может быть не определено...

Автор: fess 23.3.2005, 22:01
Цитата
компилятор делфи ругается, что значение i может быть не определено...

Не обращай внимания smile. Я также делал, ни разу не было никаких проблем.

Автор: Marriage 23.3.2005, 22:09
Цитата
Я также делал, ни разу не было никаких проблем.

Странно, что не было.
Я бы сделал так :

Код

for i := 0 to n do 
try
  something;
except
  showmessage(inttostr(i));
end;

Ошибка по идее должна пропасть.

Автор: fess 23.3.2005, 23:02
Цитата
Странно, что не было.

Почему они должны быть? Ведь значение переменной цикла не может быть измененно внутри цикла (в смысле нельзя сделать i:=5), а сразу после цикла стоит except, следовательно, переменная i не изменяется до попадания в блок исключения.
А это предупрежедние как раз говорит о том, что значение i может быть измененно.

Автор: Marriage 24.3.2005, 11:06
fess
Я имел ввиду не конкретный случай, а общий. Например цикл while

Автор: bursa 24.3.2005, 12:41
После выхода из цикла for i ... переменнная i может содержать что угодно. Чаще, конечно, там может быть то, что тебе нужно. Но, будте уверены, будут глюки. А отлавливать такие глюки (то есть ошибка, то нет) дело неблагодарное.

Делай как Marriage сказал.

Автор: fess 24.3.2005, 13:52
Цитата
После выхода из цикла for i ... переменнная i может содержать что угодно

Почему?

Автор: bursa 24.3.2005, 14:09
Цитата(fess @ 24.3.2005, 13:52)
Почему?

В учебнике по Turbo Pascal прочитал. В году эдак '89.
Цитата
Не используйте переменную из цикла for после завершения цикла.

Это связано с особенностью компилятора.
В общем, я никогда и не использовал по сегодняшний день. Может, что-то изменилось?


Автор: Marriage 24.3.2005, 15:22

НУжно еще учитывать ВЕЛИКОЛЕПНЫЙ exept.
То есть код выполняется при "глючной" ситуации. И никто не знает , что там произошло и повлекло за собой ...
Может именно там перезаписалось значение i.

Автор: Cetus 24.3.2005, 16:25
bursa , Marriage меня не интересует значение переменной _после_ выхода из цикла, а именно _в цикле_ (в т.ч. на границах)

Необходимо для следующего:
если при модификации k-го элемента массива (0 <= k <= n) обнаружилоcь, что элемент не соотв условию, то произвести 'обратную модификацию' элементов массива от 0 до k, не трогая элементы с k+1 до n.

Автор: Marriage 24.3.2005, 16:50
Cetus
Что то я не понял ....
А почему не сделать так :


Код

for i:= 0 to x do
 Begin

   IF not (проверка i-го элемента на условие ) then
     BEgin
       ОБРАТНАЯ МОДИФИКАЦИЯ
       break;
     End

 end;

Try/exept - это когда проект вовремя сдать надо !!!! smile smile smile smile smile

Автор: Cetus 25.3.2005, 08:25
Marriage smile
Пишу для MySQL, но там нет механизма транзакций, откатов.
На каждую запись свой отдельный SQL запрос, если не выполняется, то делаем откат изменений.
Поэтому приходится реализовывать все самому, через try-for-except для многопользовательского режима.

Автор: p0s0l 25.3.2005, 12:43
Надёжнее и правильнее запоминать на каждом шаге i в какой-нибудь переменной...

Добавлено @ 12:44
Или делать цикл не через for, а чере while

Автор: Гость_Cetus 26.3.2005, 12:44
ну и чем же они будут отличаться?

Автор: Marriage 26.3.2005, 16:14
Гость_Cetus
Мой ответ на твой вопрос
Код

for i := 0 to n do 
try
  something;
except
  showmessage(inttostr(i));
end;


Ну а дальше уже тебе решать.

Автор: Cetus 27.3.2005, 19:06
спасибо всем откликнувшимся !

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)