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

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

Ошибка при работе программы, идет остановка, как при трасировке..


Страницы:   1 2 3

Elena ©   (2005-02-04 09:55:00) 

Доброе время суток всем. Простите за глупый вопрос, но не знаю куда еще обратиться...
В данном цикле есть много if  вложенных и хоть остановка не стоит , при отладке программы , делфи все равно останавливается. В чем может быть причина ошибка делфи или алгоритма?

while not DM.Table2.Eof do
  begin
    for j:=1 to i do
     begin
       dka:=-1;
       dkp:=-1;
       if then
        begin
          if  условие then
           begin
              dka:=число;
           end;
        end;
       if  условие then
        begin
          if  then
           begin
            dkp:=число
           end
        end;
       if (dka<>-1) and (dkp<>-1) then
        begin
          действие
        end
       else
        begin
          if (dka=-1) and (dkp<>-1) then   
           begin
             действие
           end
          else
           begin
             if (dka<>-1) and (dkp=-1) then
              begin
                действие
              end
           end;
          if (dka=-1) and (dkp=-1) then
           действие
        end;
     end;
    DM.Table2.Next;
  end;

на выделенном if всегда идет остановка....


Elena   (2005-02-04 14:49:00) [21]

_vox_фукция okr это округление до 1000 по такому алгоритму  весь я его не превожу, так как данный блок просто несколько раз повторяется, меняется только порядок.
 k:=ch*100;
 k1:=k+0.5;
 k2:=trunc(k1);
 k2:=k2/100;
 ch:=k2;

DM_date.masdat[j] это массив дат, причем не динамический, так как всего лишь от 1 до 31.


Elena   (2005-02-04 14:38:00) [22]

ЛЮДИ это моя первая программа, в последующих я использовала и currency и запросы, когда уже писала сетевые проги и т.п. эта была написанна год назад, это локальная прога, таблички парадоксовские, если можно использовать индексы то почему бы и нет. Сейчас  год спустя после ее сдачи мне надо сделать доработку, она небольшая по сравнению со всей прогой,прога очень громозка и переписать ее пока нет возможности так как на мне очень много задач висит, поэтому, пожалуйста,  кто-нибудь может сказать что-нибудь по данному вопросу?


_vox_   (2005-02-04 14:31:00) [23]

имхо остается два варианта

1.надо копать глубже - смотреть функцию Okr и DM_date.masdat[j]. Большая часть "чудес" возникает из-за неправильной работы с памятью.

2.ошибка Delphi


msguns   (2005-02-04 14:29:00) [24]

Кстати, бог с ними, с запросами, можно обойтись и без них. А вот почему нельзя загнать текущие курсы в массив и шариться по нему, вместо того чтобы прыгать по таблице ? Ведь валют не может быть тысячи, как и счетов (если это не банк, конечно)


msguns   (2005-02-04 14:25:00) [25]

О боже, никогда еще не видел, чтоб так хитровыстиранно пересчитываались валюты. А что, на запросы в конторе вето ?

>Александр Иванов ©   (04.02.05 14:16) [18]
>(value2-value1)<0.000001

Очень ценное замечание при работе с флоатом.

Кстати, а какая необходимость была поле курса в БД вешать на флоат ?


Elena   (2005-02-04 14:23:00) [26]

Александр Иванов © ,esu ©  

хорошо сравнение это не проблема делаю trunc и все , на сколько я знаю сравнение целых чисел вполне корректно. Но ситуацию это не спасает.....уже проверила....


Александр Иванов   (2005-02-04 14:16:00) [27]

Elena ©   (04.02.05 14:14) [17]
Вещественные числа принято сравнивать так:
(value2-value1)<0.000001


Elena   (2005-02-04 14:14:00) [28]

а в чем некорректность сравнения 2-х чисел?  С currency учту на будущие, но сейчас переписывать все нафиг....

и почему думаете что данный код будет некорректно работать? объясните, пожалуйста. :-)


esu   (2005-02-04 13:45:00) [29]

мда, ну вам этот код и насчитает...
Вообщем некорректно прямое сравнение dka, dkp с 1 или -1. Ну и delphi видимо дает по этому поводу немой намек (хотя должен бы и не немой)

Если вы считаете деньги нужно использовать currency... Но это все в любом случае лучше "переписать нафиг" (c)


Elena   (2005-02-04 13:42:00) [30]

>R ©   (04.02.05 13:16) [5]
А останов выглядит как, я имею ввиду красное выделение строки или иное...

Простите не ответила не увидела, строка выделяется синем цветом, как пошаговой трасировке, т.е. как при нажатии клавиши F7.


Elena   (2005-02-04 13:34:00) [31]

double


Elena   (2005-02-04 13:31:00) [32]

dka и dkp это переменные, получаемые путем взятия из одной таблицы валюту перемножаемую на курс, т.е. если они изменяются, то становятся или положительными или нулем. При пошаговом просмотре все идет хорошо, т.е.  как надо так и идет. Сейчас попробую вообще избавиться от этих if, только вот все равно интересно в чем же ошибка, чтобы на будущие в это опять не вляпаться....


esu   (2005-02-04 13:31:00) [33]

А какой тип у этих dka, dkp ?


Elena   (2005-02-04 13:26:00) [34]

DM.Table2.First;
 while not DM.Table2.Eof do
  begin
    for j:=1 to i do
     begin
       dka:=-1;
       dkp:=-1;
       s:=datetostr(DM_date.masdat[j]);
       sd:=copy(s,1,2);
       if DM.temp2.FindKey([DM_date.masdat[j],'840',DM.Table2.FieldByName('Schet').AsString])=true then
        begin
          if DM.Kurs.FindKey([DM_date.masdat[j],'840'])=true then
           begin
              dka:=DM.temp2.fieldbyname('3_s').AsFloat*DM.Kurs.fieldbyname('kurs').AsFloat;
              Unit1.okr(dka);
           end;
        end;
       if DM.temp2.FindKey([DM_date.masdat[j],'978',DM.Table2.FieldByName('Schet').AsString])=true then
        begin
          if DM.Kurs.FindKey([DM_date.masdat[j],'978'])=true then
           begin
            dkp:=DM.temp2.fieldbyname('3_s').AsFloat*DM.Kurs.fieldbyname('kurs').AsFloat;
            Unit1.okr(dkp);
           end
        end;
       if (dka<>-1) and (dkp<>-1) then
        begin
          DM.Table2.Edit;
          DM.Table2.FieldByName(floattostr(strtofloat(sd)+3)+'_s').AsFloat:=dka+dkp;
          DM.Table2.Post;
        end
       else
        begin
          if (dka=-1) and (dkp<>-1) then
           begin
             DM.Table2.Edit;
             DM.Table2.FieldByName(floattostr(strtofloat(sd)+3)+'_s').AsFloat:=dkp;
             DM.Table2.Post;
           end
          else
           begin
             if (dka<>-1) and (dkp=-1) then
              begin
                DM.Table2.Edit;
                DM.Table2.FieldbyName(floattostr(strtofloat(sd)+3)+'_s').AsFloat:=dka;
                DM.Table2.Post;
              end
           end;
          if (dka=-1) and (dkp=-1) then
           so:=so+' '+DM.Table2.fieldbyname('Schet').AsString;
        end;
     end;
    DM.Table2.Next;
  end;

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


_vox_   (2005-02-04 13:25:00) [35]

Можно попробовать изменить структуру текста - добавить пару пустых строк перед проблемным оператором или разбить оператор на несколько строк. Если отлаживать код по F8 что происходит на этом месте ??? Какие значения имеют переменные dka, dkp во время отладки на этом операторе ?


Digitman   (2005-02-04 13:19:00) [36]

что-то какая-тя каша страшная в алгоритме ...


esu   (2005-02-04 13:18:00) [37]

Есть у меня подозрение что дело где-то в этих "действие" :) Можно код целиком, начиная скажем с DM.Table2.First


Elena   (2005-02-04 13:18:00) [38]

ничего , просто на данном месте приостанавливает работу программы...:-(((


esu   (2005-02-04 13:17:00) [39]

И ни слова не пишет ? Никакой ошибки не выскакивает ?


R   (2005-02-04 13:16:00) [40]

Да действительно с Else begin end
все правильно.
Ну тогда трудно сказать что за прикол такой.
А останов выглядит как, я имею ввиду красное выделение строки или иное...


Страницы:   1 2 3

Наверх

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