Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> корректность кода, try for i:= ... except end 
:(
    Опции темы
Cetus
Дата 23.3.2005, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 18.4.2004

Репутация: нет
Всего: 1



возник вопрос, является ли код корректным?
Код

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


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

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

Это сообщение отредактировал(а) Alex - 23.3.2005, 21:36
--------------------
Легко внести изменения в код.Трудно сделать это корректно.
PM MAIL   Вверх
fess
Дата 23.3.2005, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: 2
Всего: 3



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

Не обращай внимания smile. Я также делал, ни разу не было никаких проблем.
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Marriage
Дата 23.3.2005, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Цитата
Я также делал, ни разу не было никаких проблем.

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

Код

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

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


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
fess
Дата 23.3.2005, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: 2
Всего: 3



Цитата
Странно, что не было.

Почему они должны быть? Ведь значение переменной цикла не может быть измененно внутри цикла (в смысле нельзя сделать i:=5), а сразу после цикла стоит except, следовательно, переменная i не изменяется до попадания в блок исключения.
А это предупрежедние как раз говорит о том, что значение i может быть измененно.
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Marriage
Дата 24.3.2005, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



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


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
bursa
Дата 24.3.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 25.2.2005
Где: Липецк

Репутация: нет
Всего: 1



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

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

Это сообщение отредактировал(а) bursa - 24.3.2005, 12:42
PM MAIL   Вверх
fess
Дата 24.3.2005, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: 2
Всего: 3



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

Почему?
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
bursa
Дата 24.3.2005, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 25.2.2005
Где: Липецк

Репутация: нет
Всего: 1



Цитата(fess @ 24.3.2005, 13:52)
Почему?

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

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


PM MAIL   Вверх
Marriage
Дата 24.3.2005, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2




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

Это сообщение отредактировал(а) Marriage - 24.3.2005, 15:24


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
Cetus
Дата 24.3.2005, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 18.4.2004

Репутация: нет
Всего: 1



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

Необходимо для следующего:
если при модификации k-го элемента массива (0 <= k <= n) обнаружилоcь, что элемент не соотв условию, то произвести 'обратную модификацию' элементов массива от 0 до k, не трогая элементы с k+1 до n.
--------------------
Легко внести изменения в код.Трудно сделать это корректно.
PM MAIL   Вверх
Marriage
Дата 24.3.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Cetus
Что то я не понял ....
А почему не сделать так :


Код

for i:= 0 to x do
 Begin

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

 end;

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


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
Cetus
Дата 25.3.2005, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 18.4.2004

Репутация: нет
Всего: 1



Marriage smile
Пишу для MySQL, но там нет механизма транзакций, откатов.
На каждую запись свой отдельный SQL запрос, если не выполняется, то делаем откат изменений.
Поэтому приходится реализовывать все самому, через try-for-except для многопользовательского режима.
--------------------
Легко внести изменения в код.Трудно сделать это корректно.
PM MAIL   Вверх
p0s0l
Дата 25.3.2005, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Надёжнее и правильнее запоминать на каждом шаге i в какой-нибудь переменной...

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


--------------------
С уважением, г-н Посол.
PM   Вверх
Гость_Cetus
Дата 26.3.2005, 12:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ну и чем же они будут отличаться?
  Вверх
Marriage
Дата 26.3.2005, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Гость_Cetus
Мой ответ на твой вопрос
Код

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


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


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
Cetus
Дата 27.3.2005, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 18.4.2004

Репутация: нет
Всего: 1



спасибо всем откликнувшимся !
--------------------
Легко внести изменения в код.Трудно сделать это корректно.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1694 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.