Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Не могу понять причину   Найти похожие ветки 

 
NotBeginer   (2006-01-14 11:05) [0]

Доброго времени суток.
Что-то я не пойму. объясните пожалуйсто.
есть цикл: При некоторых условиях он зависает
 for k:=1 to FormMain.QuantityQ do
    begin
      find:=false; - при отладке вот отсюда прыгает в начало цикла, почему так? Код который находится ниже не выполняется
      while not find do
      begin
........
Заметил еще одну особунность
к примеру опять есть цикл

 Count:=0;
 
 for k:=1 to FormMain.QuantityQ do
    begin
          Какой-то код  // после выполнения, пргает не в начало цикла, а то место где находится строка count:=0;


 
Virgo_Style ©   (2006-01-14 11:58) [1]

При некоторых условиях он зависает
Есть мнение, что это условие - find=false


 
NotBeginer   (2006-01-14 23:39) [2]

Так и не разобрался.
Почему может быть такое:
При выполнение следующего цикла, каждый раз цикл прыгает на строчку ShowMessage("tttt"); и программа зависает, i так и остается равным 1.

ShowMessage("tttt");
for i:=1 to 100 do
begin
  inc(b)
end;


 
VirEx ©   (2006-01-15 00:02) [3]


>  [2] NotBeginer   (14.01.06 23:39)

а где этот код? может выполняется в другом потоке?


 
NotBeginer   (2006-01-15 00:14) [4]

У меня в проекте 2е формы, одна из них модальная, здесь и выполняется код, может это какую-то роль играет?
Уже измучался, не знаю что делать, причем иногда все нормально работает, но чаше происходит то, что я описал


 
Fenik ©   (2006-01-15 00:21) [5]

Покажите все тело цикла.


 
NotBeginer   (2006-01-15 00:26) [6]


      ShowMessage("lol"); - Вот этот код выполняется каждый раз, и цикл зависате :\
 {Ñëó÷àéíûì îáðàçîì âûáèðàåì âîïðîñû èç ìàññèâà è äîáàâëÿåì èõ â òàáëèöó}
    for k:=1 to FormMain.QuantityQ do
    begin
      while not find do
      begin
        RandomIndex:=Random(QuestionsCount+4);
        if (ArrayOfQuestions[randomindex]<>-1)and(RandomIndex>0) then
        begin
           dmData.tblQuestionsOut.InsertRecord([nil,IntToStr(i),IntToStr(ArrayOfQuestions[randomindex])]);;
           find:=true;
           QuestionID:=IntToStr(ArrayOfQuestions[randomindex]);
           ArrayOfQuestions[randomindex]:=-1;
           SqlCommand:="select QUESTION from TBL_QUESTIONS where ID_QUESTION="+QuestionID;
           dmData.ADOCommandIN.CommandText:=SqlCommand;
           RVFQuestion := dmData.ADOCommandIN.Execute.Fields[0].Value;

           assignfile(f,ExtractFilePath(ParamStr(0))+IntToStr(i)+IntToStr(k)+".qus");
           rewrite(f);
           writeln(f,RVFQuestion);
           closefile(f);
        end;
      end;
             find:=false;
        {&#199;&#224;&#239;uc&#251;&#226;&#224;&#229;&#236; &#226; &#242;&#224;&#225;&#235;&#232;&#246;&#243; &#226;&#224;&#240;&#232;&#224;&#237;&#242;&#251; &#238;&#242;&#226;&#229;&#242;&#238;&#226;}
           dmData.tblAnswers.Requery;
           ACount:=0;
           while not dmData.tblAnswers.Eof do
           begin
             Inc(Acount);
             dmData.tblQuestions.Locate("ID_QUESTION",QuestionID,[loCaseInsensitive, loPartialKey]);
             QuestionID_Q:=dmData.tblAnswers.FieldValues["ID_QUESTION"];
             AnswerID:=dmData.tblAnswers.FieldValues["ID_ANSWER"];

             CorrectString:=dmData.tblAnswers.FieldValues["Correct"];
             Correct:=StrToBool(CorrectString);
             Beep;
             if  QuestionID=QuestionID_Q then
             begin
                 dmData.tblAnswersOut.InsertRecord([nil,QuestionID,Acount,BoolToStr(Correct)]);
             end;

             SqlCommand:="select ANSWER from TBL_ANSWERS where ID_ANSWER="+AnswerID;
             dmData.ADOCommandIN.CommandText:=SqlCommand;

             try
              RVFAnswer := dmData.ADOCommandIN.Execute.Fields[0].Value;

              assignfile(f,ExtractFilePath(ParamStr(0))+IntToStr(i)+IntToStr(k)+"."+IntToStr(ACount));
              rewrite(f);
              writeln(f,RVFAnswer);
              closefile(f);
             except end;
                            dmData.tblAnswers.Next;
           end;

      {///---///}
    end;
 {/----------------/}
 end;


 
Fenik ©   (2006-01-15 00:26) [7]

> NotBeginer  (14.01.06 23:39) [2]

У меня ничего не зависло. Какого типа b?


 
VirEx ©   (2006-01-15 00:27) [8]


>  [4] NotBeginer   (15.01.06 00:14)
> У меня в проекте 2е формы, одна из них модальная, здесь
> и выполняется код, может это какую-то роль играет?

модальная форма если мне не изменяет память может влиять: все сообщения к главной форме игнорируются и цикл может прерваться...


 
Fenik ©   (2006-01-15 00:28) [9]

dmData.tblQuestionsOut.InsertRecord([nil,IntToStr(i),IntToStr(ArrayOfQuestions[randomindex])]);;

Две точки с запятой ";" :)))


 
NotBeginer   (2006-01-15 00:35) [10]


> Fenik

)
> VirEx ©   (15.01.06 00:27) [8]


Тогда лучше избавляться от модальных форм? Или может что посоветуете?


 
VirEx ©   (2006-01-15 00:41) [11]

займись трассировкой, но ведь не сложно поставить брэкпоинт, жми F9, когда дойдёт до брэкпоинта жми F7 (пошаговое выполнение) или F8 (пошаговое выполнение но не будет "углубляться/заходить" в функции/процедуры), вот и увидешь по каким строкам выполняется программа.
когда стоит на брэкпоинте можно посмотреть значение переменной - подведи мышку к переменной, либо надо устанавливать через меню Debug - watch (вроде как)


 
NotBeginer   (2006-01-15 00:44) [12]

В том то и дело, что цикл начинает выполняться, но счетчик не изменяется, а коды выполняется тот, который стоит выше самого цикла


 
Fenik ©   (2006-01-15 00:45) [13]

Да модальные формы тут не причем.
Наверное цикл
  while not find do
  begin
бесконечен, т.к. ничего не находится.


 
NotBeginer   (2006-01-15 00:50) [14]


> Да модальные формы тут не причем.
> Наверное цикл
>   while not find do
>   begin
> бесконечен, т.к. ничего не находится.

Говорю же этот код вообще не выполняется (ставлю точку останова внутри), цикл выполняет сразу же прыгает на строчку выыше цикла, а потом опять в цикл, счетчик не меняется, все время остается 1


 
Fenik ©   (2006-01-15 01:03) [15]

Может тогда проблема в обращении к FormMain.QuantityQ?
попробуй вот как
 N := FormMain.QuantityQ;
 if N > 0 then
 for k:=1 to N do
 begin
  while not find do


 
DrPass ©   (2006-01-15 01:17) [16]


> Говорю же этот код вообще не выполняется (ставлю точку останова
> внутри), цикл выполняет сразу же прыгает на строчку выыше
> цикла, а потом опять в цикл, счетчик не меняется, все время
> остается 1

Оптимизацию кода компилятором, небось, забыл выключить?


 
NotBeginer   (2006-01-15 11:52) [17]


> Оптимизацию кода компилятором, небось, забыл выключить?

:) а можно спросит как ее выключить?
Буду очень благодарен


 
Fay ©   (2006-01-15 11:53) [18]

NotBeginer   (15.01.06 11:52) [17]
{O-}


 
begin...end ©   (2006-01-15 11:56) [19]

> Fay ©   (15.01.06 11:53) [18]

Доллар забыли.
:о)


 
Fay ©   (2006-01-15 11:56) [20]

Точно. Старею...


 
NotBeginer   (2006-01-15 20:21) [21]

А что делает эта самая оптимизация? Как она влияет на выполнение кода? Значит из-за этого так получается?
Всем спасибо


 
Alarm ©   (2006-01-15 21:36) [22]

Проверь, а что за переменная find, не определена ли она в проекте несколько раз (как глобальная и локалньная в процедурах / функциях)
Ну и кроме того крайне нежелательно пользоваться такими именами (не исключено, что это зарезервированное слово), попробубуй поменять его хотя бы на qwerty


 
NotBeginer   (2006-01-15 23:08) [23]

Ничего не помогло :\
Как гнал, так и гонит
> Проверь, а что за переменная find, не определена ли она
> в проекте несколько раз (как глобальная и локалньная в процедурах
> / функциях)


Нет, данная переменна только в этой процедуре. Больше нигде ее нет


 
Плохиш ©   (2006-01-16 01:18) [24]


> NotBeginer   (15.01.06 00:26) [6]
>
>       ShowMessage("lol"); - Вот этот код выполняется каждый
> раз, и цикл зависате :\

Хм, а ты на кнопочку "Ок" в показанном сообщении нажимаешь?


 
evvcom ©   (2006-01-16 10:20) [25]


> Говорю же этот код вообще не выполняется (ставлю точку останова
> внутри), цикл выполняет сразу

Иногда (такое бывает) в тексте программы пропадает один из символов в #13#10. Редактор это дело нормально разруливает и мы видим перенос строки, а компилятор (лексический анализатор) этого переноса строки не видит. И в режиме отладки мы видим прыжки по строкам, которые на самом деле в настоящий момент не выполняются.
Решение: загрузить этот файл *.pas, например, в блокноте, внести какие-нибудь изменения (добавить и удалить символ), сохранить, загрузить в Delphi.

>       while not find do
>       begin
>         RandomIndex:=Random(QuestionsCount+4);
>         if (ArrayOfQuestions[randomindex]<>-1)and(RandomIndex>0) then
>         begin
>            ...
>         end;
>       end;

Если условие в if не выполняется, то find нигде не меняется. Вот он и бесконечный цикл.


 
Чапаев ©   (2006-01-16 10:34) [26]


> Решение: загрузить этот файл *.pas, например, в блокноте,
>  внести какие-нибудь изменения (добавить и удалить символ),
>  сохранить, загрузить в Delphi.

Ну не знаю... Мне в таких случаях помогало удаление *.dsk соответствующего проекта.


 
evvcom ©   (2006-01-16 10:36) [27]


> Мне в таких случаях помогало удаление *.dsk

А при чем здесь desktop? Как удаление этого файла повлияет на корректировку файла *.pas?


 
Fay ©   (2006-01-16 11:17) [28]

evvcom ©   (16.01.06 10:36) [27]
Очень просто. Возможно в редакторе открыт не тот файл (но с таким же именем), что указан в проекте.


 
evvcom ©   (2006-01-16 11:26) [29]


> Возможно в редакторе открыт не тот файл (но с таким же именем),
>  что указан в проекте

Тогда трассировка по нему не пойдет.



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

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.048 c
2-1138278189
Daria
2006-01-26 15:23
2006.02.12
процент выполнения


6-1130869354
olevacho_
2005-11-01 21:22
2006.02.12
Как выйти из OnExecute?


2-1137862988
JEK2
2006-01-21 20:03
2006.02.12
Распечатка документа с картинками


6-1130933573
oleggar
2005-11-02 15:12
2006.02.12
openssl


15-1137789335
Cerberus
2006-01-20 23:35
2006.02.12
Рассказик