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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.039 c
15-1138080476
Antip
2006-01-24 08:27
2006.02.12
Пишется ли в exe-шник лицензионная инфа о Delphi?


11-1118647887
konst
2005-06-13 11:31
2006.02.12
Работа со статусной строкой


2-1138093559
luser
2006-01-24 12:05
2006.02.12
Запуск приложений


2-1137944438
PIF
2006-01-22 18:40
2006.02.12
работа с ресурсами


3-1134209177
312Kbps
2005-12-10 13:06
2006.02.12
файл данных *.gtd !!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский