![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в delphi 7 [D7, WinXP]
Sicilla © (2004-11-17 18:34:00)Привет всем. Постваил себе delphi 7 взамен delphi 5. delphi 5 не удалял. И теперь ошибка: при отладке F7 например в переменной i значение 2, а кажет, что там 10 или -5. Хотя считает правильно в целом.
Gero (2004-11-17 23:37:00) [121]
> IMHO те кто пользуется
> Goto, Break, Continue, Exit
> просто не могут нормально реализовать логику программы.
Да, кстати, с таким же успехом можно утверждать, что нормально реализовать логику программы не могут те, кто не использует Goto, Break, Continue и Exit.
Если язык позволяет - то почему бы не использовать?
Gero (2004-11-17 23:35:00) [122]
> IMHO те кто пользуется
> Goto, Break, Continue, Exit
> просто не могут нормально реализовать логику программы.
Неужели в борланде работают именно такие?
Всем из вышеперечисленного(кроме goto) активно пользуюсь, и не сказал бы, что код получается хуже по читаемости чем без них, а порой и лучше.
Простейший пример:
for i := 0 to High(Arr) do
begin
if IsError(Arr[i]) then Break;
<Код>
end;
Реализуйте это красивее без Break.
Defunct (2004-11-17 23:19:00) [123]> А зачем целых 3(!!!) вида цикла??
На все случаи жизни ;>
Вопрос в другом, зачем имея аж 3 оператора цикла применять какие-то Continue, break и т.п?
Palladin (2004-11-17 23:13:00) [124]
> [14] Defunct © (17.11.04 22:35)
Зачем break и continue? Ну уж от вас таких заявлений не ожидал.
Цикл While. Обработка чего угодно, множество условий выхода из цикла. Множество условий для возврата исполнения на начало тела цикла. Выход один. While True Do и использование Break и Continue.
Defunct (2004-11-17 22:35:00) [125]for x := 1 to num do
begin
if (prov_info.way[x] = 0) and (abs(j) > 0) then
begin
prov_info.way[x] := abs(j) + ini.kol_prov;
if j > 0 then dec(j);
if j < 0 then inc(j);
if i = 0 then break;
end;
end;
что мешает этот цикл записать так:
if i<>0 then
for x := 1 to num do
if (prov_info.way[x] = 0) and (abs(j) > 0) then
begin
prov_info.way[x] := abs(j) + ini.kol_prov;
if j > 0 then dec(j) else inc(j)
end;
и не надо никаких Break'ов, и кода меньше.
Хотя возможно автор допустил ошибку именно в строке с Break (вероятно там не if i = 0, а должно было быть if j=0)
но и в этом случае, можно обойтись без Break:
x := 1;
Repeat
if (prov_info.way[x] = 0) and (abs(j) > 0) then
begin
prov_info.way[x] := abs(j) + ini.kol_prov;
if j > 0 then dec(j) else inc(j)
end;
inc(x);
Until (x>=num) or (j=0);
А теперь давайте подумаем, что лучше для понимания и отладки:
- ровная логика с условием выхода, записанным в одной строке
- или кривая логика с возможностью выпрыгнуть из цикла прямо из тела цикла.
jack128 (2004-11-17 22:29:00) [126]Defunct © (17.11.04 22:14) [11]
Код трудночитаем.
Код трудночитаем из-за нестандартных отступов, ИМХО.
jack128 (2004-11-17 22:28:00) [127]Defunct © (17.11.04 22:01) [9]
А зачем целых 3(!!!) вида цикла?? Вполне достаточно одного while.
Defunct (2004-11-17 22:14:00) [128]2 Gero,
[2] кстати демонстрирует то о чем я говорю.
Код трудночитаем.
и по всей видимости вообще неправильно работает и на D5 и на D7:
for i := 1to lstEntries.Items.Count do
Defunct (2004-11-17 22:02:00) [129][9]
4. LOL суперопечатка.
Defunct (2004-11-17 22:01:00) [130]> Тогда уж и Break в придачу.
Абсолютно точно, и break туда же.
IMHO те кто пользуется
Goto, Break, Continue, Exit
просто не могут нормально реализовать логику программы.
> А можно и циклы вобще выкинуть. Нафиг они нужны?
не извращайте идею.
C помощью 7-ми операторов можно реализовать любую логику:
1. пустой оператор - ;
2. оператор присваивания :=
3. Условный оператор if <> then <оператор> else <оператор>
4. Оператор цикла с пердусловием while <условие> do <оператор>
5. Оператор цикла с постусловием repeat <оператор> until <условие>
6. Оператор цикла с границами for <от> to <до> do <оператор>
7. Составной оператор begin <оператор>.. end.
два доп. оператора case и with можно применять для красоты и наглядности программы.
Continue, Break, Goto, Exit лишь запутывают логику программы и делают программу трудно читаемой.
Gero (2004-11-17 21:46:00) [131]
> Defunct © (17.11.04 21:41)
Тогда уж и Break в придачу.
А можно и циклы вобще выкинуть. Нафиг они нужны?
Имхо
Defunct (2004-11-17 21:41:00) [132]а зачем Continue вообще нужен?
также как и Goto и Exit его место на помойке IMHO.
begin...end (2004-11-17 20:12:00) [133]
> Continue в коде не обнаружилось
Так что глюк уже не в Delphi.
Anatoly Podgoretsky (2004-11-17 20:09:00) [134]Continue в коде не обнаружилось
Sicilla (2004-11-17 20:01:00) [135]
function Tform1.change_record(num: byte): integer;
var
x,i,j: Integer;
last, now_1: byte;
begin
for x := 1 to prov do
begin
way_old[x] := prov_info.way[x];
prov_info.way[x] := 0;
end;
for i := 1 to num do
for x := 1 to prov do
begin
if prov_info.P[x,1] = lstEntries.Items.Strings[i-1] then
prov_info.way[i] := x;
end;
j := num - ini.kol_prov;
for x := 1 to num do
begin
if (prov_info.way[x] = 0) and (abs(j) > 0) then
begin
prov_info.way[x] := abs(j) + ini.kol_prov;
if j > 0 then dec(j);
if j < 0 then inc(j);
if i = 0 then break;
end;
end;
j := num - ini.kol_prov; // отсюда глюки
if j > 0 then
begin
for i := num downto 1 do
for x := prov downto 1 do
if (way_old[x] = prov_info.way[i]) and (prov_info.way[i] <> 0) and (way_old[x] <> 0) then
begin
last := way_old[x];
now_1 := i;
form1.Change(num,last,now_1);
end;
end;
if j < 0 then
begin
for i := 1 to num do
for x := 1 to prov do
if (way_old[x] = prov_info.way[i]) and (prov_info.way[i] <> 0) and (way_old[x] <> 0) then
begin
last := way_old[x];
now_1 := i;
form1.Change(num,last,now_1);
end;
end;
EXE.P[last] := prov_info.p[now_1];
//
for i := 1 to prov do
Prov_info.P[i,1] := '';
for i := 1 to lstEntries.Items.Count do
begin
Prov_info.P[i,1] := lstEntries.Items.Strings[i-1];
prov_info.way[i] := i
end;
ini.kol_prov := lstEntries.Items.Count;
change_prov(col);
end;
первые пару циклов нормальон кажет, потом начинается фигня.
type
PRI = record
P : array[1..prov,1..20] of string[50];
way: array[1..prov] of byte;
end;
Prov_info, Exe: PRI;
const prov = 9
begin...end (2004-11-17 19:11:00) [136]
> [2] Sicilla (17.11.04 19:07)
> Да, в основном этот глюк в цикле.
В случае цикла это нормальное поведение.
> И еще не реагирует в циклах на команду Continue.
Приведи код.
Sicilla (2004-11-17 19:07:00) [137]Да, в основном этот глюк в цикле. И еще не реагирует в циклах на команду Continue. Сволочь:((
begin...end (2004-11-17 18:49:00) [138]
> Sicilla (17.11.04 18:34)
i - это не счётчик цикла случайно?