Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка в delphi 7 [D7, WinXP]


Страницы:   1 2 3 4 5 6 7

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 - это не счётчик цикла случайно?


Страницы:   1 2 3 4 5 6 7

Наверх

Титульная страница Поиск, карта сайта Написать письмо