Форум: "Основная";
Текущий архив: 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;
{Çàïucûâàåì â òàáëèöó âàðèàíòû îòâåòîâ}
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.04 c