Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
Elena ©   (2005-02-04 09:55) [0]

Доброе время суток всем. Простите за глупый вопрос, но не знаю куда еще обратиться...
В данном цикле есть много 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 всегда идет остановка....


 
_vox_   (2005-02-04 12:29) [1]

> и хоть остановка не стоит , при отладке программы , делфи все равно останавливается

При отладке Delphi и должна останавливатся, причём на каждой строке


 
Elena ©   (2005-02-04 12:37) [2]

извините за неточность, выражу свою мысль точнее, при запуске программы из Делфи, т.е. при нажатии F9.


 
©   (2005-02-04 12:44) [3]

Внимательнее с Else begin end


 
Elena ©   (2005-02-04 13:07) [4]

все перепроверила кучу раз все begin, end, else и if все синтаксису соответствует, что самое интересное что прога рабочая, exe-шник отрабатывает без проблем, а вот в делфи такая ситуация, причем после некоторого кол-ва раз нажатия продолжения работы когда она стопорится все отлично отрабатывается.... Делфи только что преустановила , безрезультатно....:-((((


 
©   (2005-02-04 13:16) [5]

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


 
esu ©   (2005-02-04 13:17) [6]

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


 
Elena ©   (2005-02-04 13:18) [7]

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


 
esu ©   (2005-02-04 13:18) [8]

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


 
Digitman ©   (2005-02-04 13:19) [9]

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


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

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


 
Elena ©   (2005-02-04 13:26) [11]

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;

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


 
Elena ©   (2005-02-04 13:31) [12]

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


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

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


 
Elena ©   (2005-02-04 13:34) [14]

double


 
Elena ©   (2005-02-04 13:42) [15]

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

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


 
esu ©   (2005-02-04 13:45) [16]

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

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


 
Elena ©   (2005-02-04 14:14) [17]

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

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


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

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


 
Elena ©   (2005-02-04 14:23) [19]

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

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


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

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

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

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

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


 
msguns ©   (2005-02-04 14:29) [21]

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


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

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

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

2.ошибка Delphi


 
Elena ©   (2005-02-04 14:38) [23]

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


 
Elena ©   (2005-02-04 14:49) [24]

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

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


 
msguns ©   (2005-02-04 15:11) [25]

>Elena ©   (04.02.05 14:49) [24]
>по такому алгоритму  весь я его не превожу, так как данный блок просто несколько раз повторяется, меняется только порядок.

Засстрелиться (Соловьев (с))


 
Elena ©   (2005-02-04 15:16) [26]

msguns ©   (04.02.05 14:29) [21]
А вот почему нельзя загнать текущие курсы в массив и шариться по нему, вместо того чтобы прыгать по таблице ? Ведь валют не может быть тысячи, как и счетов (если это не банк, конечно)

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


 
Elena ©   (2005-02-04 15:21) [27]

msguns © не стреляйтесь , пожалуйста, а лучше приведите пример алгоритма корректного округления.....


 
Konstantin_M   (2005-02-04 15:25) [28]

Возможно несоответствие версий файлов  FILE1.PAS и FILE1.DCU.


 
Elena ©   (2005-02-04 15:34) [29]

Konstantin_M  а поясните свой ответ, пожалуйста, потому что я не поняла какие мне делать выводы :-))


 
Konstantin_M   (2005-02-04 15:41) [30]

Проверить расположение файла .dcu
Project
  Options
     Directories <Unit Output Directory>


 
msguns ©   (2005-02-04 15:41) [31]

>Elena ©   (04.02.05 15:21) [27]
>msguns © не стреляйтесь , пожалуйста, а лучше приведите пример алгоритма корректного округления.....

До сотых копейки (как пример):
m := Round(m*10000)/10000;

А кардинального решения все равно не даст, т.к. в базу запишется флоат, т.е. с "хвостом". Но это не должно волновать, т.к. он будет не ооочень маленьким.


 
Konstantin_M   (2005-02-04 15:43) [32]

Еще список в <Search path>, нет ли в нем папки со старым DCU.


 
Elena ©   (2005-02-04 15:53) [33]

msguns ©  До сотых копейки (как пример):
m := Round(m*10000)/10000;

Это не совсем корректно, так как в зависимости от сопроцессора машины, винды и делфи округление идет +-1, у меня при это будут теряться тысячи, согласитесь значительная погрешность.....

например как round оценит 23,5 как 23 или 24 ?


 
msguns ©   (2005-02-04 15:59) [34]

>Elena ©   (04.02.05 15:53) [33]
>Это не совсем корректно, так как в зависимости от сопроцессора машины, винды и делфи округление идет +-1, у меня при это будут теряться тысячи, согласитесь значительная погрешность.....

Я уж умножил сначала !!! Мало на 10000, умножьте на мульон, мульярд.

>например как round оценит 23,5 как 23 или 24 ?

Вам надо по-бухгалтерски или по математически (не смейтесь - разница есть). Если по математически, то я уже все сказал, если бухгалтерски, то да, надо писать свою фичу (может, и есть стандартная, но я про такую не слыхивал). Но я лично сомневаюсь, т.к. Вам, скорее всего надо перевести из тугриков в пиастры, а не вычислять НДС или отчисление в ПФ. Или я не прав ?


 
Elena ©   (2005-02-04 16:02) [35]

msguns ©  мне как раз надо бугалтерию...поэтому и приходиться извращаться....


 
msguns ©   (2005-02-04 16:07) [36]

>Elena ©   (04.02.05 16:02) [35]
>msguns ©  мне как раз надо бугалтерию...поэтому и приходиться извращаться....

Так вот про извращение и говорил. Ведь то, что Вы выложили, иначе и назвать-то трудно. Блин, была у меня библиотека с "бухгалтерскими" фичами, но на другой работе.. Там были выверты и с датами, и с периодами, и с округлениями вроде тоже были. Кстати, округление, насколько помню, совсем мало "весило". Если Вы мне напомните правило, я Вам попробую "освежить" его в памяти. Там что-то о знаке после 4, да ?


 
Elena ©   (2005-02-04 16:08) [37]

Konstantin_M   очень подозреваю что вы правы, потому что раньше все хорошо работало, но с течением обстоятельств пришлось откатыватся, а по правильному это было сделать лень, точнее просто зашла в копии и правила там, а не в основной папке с кодом, который кстати находится в следующей доработке (поэтому и не стала править в ней...Господи когда пользователи смогут уже точно формулировать то что они хотят....:-)) Скорее всего в этом и проблема, буду разбираться, к сожалению что-то ему еще не нравиться, что не входит в ваш перечень :-))))


 
msguns ©   (2005-02-04 16:10) [38]

И еще. Леночка, сделайте одолжение, осчасливьте старика, заставьте Бога молить,- сделайте массив курсов и

   НЕ МУЧАЙТЕ ДАТАСЕТ !!!

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


 
Elena ©   (2005-02-04 16:13) [39]

msguns ©   проблема в цифре 5 после запятой, одни считают что округлять надо в большую сторону другие в меньшую, т.е. есть уже пример из жизни когда одна и таже прога на разных машинах считает по разному. Вот в этом то и  основная проблема в плане округления...


 
Elena ©   (2005-02-04 16:21) [40]

msguns © не могу устоять перед такой слезной просьбой и обязательно исправлю, но фишка все же в том что это не влияет на работу проги :-)))) Мне кажется все-таки дело в делфи, так что я иду домой, мучать делфи там :-))))

Спасибо всем большое за помощь :-)))



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.037 c
1-1107778004
snowkam
2005-02-07 15:06
2005.02.20
консоль


3-1106123155
slaga
2005-01-19 11:25
2005.02.20
Как лучше сравнить два разнотипных DateSet


14-1106859717
Delphin
2005-01-28 00:01
2005.02.20
Hi All! Не могли бы вы помочь решить другую задачку:


14-1107255884
Футболер
2005-02-01 14:04
2005.02.20
Фетисов рулез!


14-1107119251
Leaner
2005-01-31 00:07
2005.02.20
Пошаговая отладка в DLL.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский