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

Вниз

У меня глюки   Найти похожие ветки 

 
Separator ©   (2003-01-31 11:31) [0]


CountNaprs:= 14;
k:= -1;
for i:= 0 to (CountNaprs - 1) do //Тута глюк
if i = CountNaprs then //Это добавил из-за глюка
break
else
for j:= 1 to 3 do
if arrDopTC[i, j].NumPar <> 0 then
begin
Inc(k);
frmMain.AQuery.Fields.Fields[k].GetData(@Par);
Temp:= Par.Vkv;
for l:= 1 to 8 do
begin
if arrDopTC[i, j].Inv then
begin
if Temp mod 2 <> 0 then
StBin[l]:= "1"
else
StBin[l]:= "1"
end
else
begin
if Temp mod 2 <> 0 then
StBin[l]:= "1"
else
StBin[l]:= "0"
end;
Temp:= Temp div 2
end;
case j of
1: case BitTC1[1] of
"0": frmMain.StrGrid1.Cells[CountWork + StrToInt(BitTC1[2]), i + 1]:= StBin[arrDopTC[i, j].NumBit];
"1": frmMain.StrGrid2.Cells[CountWork + StrToInt(BitTC1[2]), i + 1]:= StBin[arrDopTC[i, j].NumBit]
end;
2: case BitTC2[1] of
"0": frmMain.StrGrid1.Cells[CountWork + StrToInt(BitTC2[2]), i + 1]:= StBin[arrDopTC[i, j].NumBit];
"1": frmMain.StrGrid2.Cells[CountWork + StrToInt(BitTC2[2]), i + 1]:= StBin[arrDopTC[i, j].NumBit]
end;
3: case BitTC3[1] of
"0": frmMain.StrGrid1.Cells[CountWork + StrToInt(BitTC3[2]), i + 1]:= StBin[arrDopTC[i, j].NumBit];
"1": frmMain.StrGrid2.Cells[CountWork + StrToInt(BitTC3[2]), i + 1]:= StBin[arrDopTC[i, j].NumBit]
end
end;
end
else
case j of
1: case BitTC1[1] of
"0": frmMain.StrGrid1.Cells[CountWork + StrToInt(BitTC1[2]), i + 1]:= "2";
"1": frmMain.StrGrid2.Cells[CountWork + StrToInt(BitTC1[2]), i + 1]:= "2"
end;
2: case BitTC2[1] of
"0": frmMain.StrGrid1.Cells[CountWork + StrToInt(BitTC2[2]), i + 1]:= "2";
"1": frmMain.StrGrid2.Cells[CountWork + StrToInt(BitTC2[2]), i + 1]:= "2"
end;
3: case BitTC3[1] of
"0": frmMain.StrGrid1.Cells[CountWork + StrToInt(BitTC3[2]), i + 1]:= "2";
"1": frmMain.StrGrid2.Cells[CountWork + StrToInt(BitTC3[2]), i + 1]:= "2"
end
end;

Кто хочет может поразбираться в коде. А проблема вот в чем, цикл for i:= 0 to (CountNaprs - 1) do по идее должен идти от 0 до 13, а он продолжется, т.е. переменная i принимает значения 14, 15, 16... и при этом не происходит выход из цикла, для этого я и вставил if i = CountNaprs then break


 
Delirium^.Tremens ©   (2003-01-31 11:35) [1]

Да брось... Иди день рождения отмечать :-)


 
Calm ©   (2003-01-31 11:36) [2]

Разбираться времени нет. Есть несколько предположений.

1. Не изменяется ли в теле цикла CountNaprs? (бегло глянул, кажется не меняется, но проверь сам еще раз)

2. Что есть CountNaprs? Если это свойство (property), то как получается его значение - через поле или метод? Если через метод, то может действия в теле цикла приводят к тому, что значение свойства увеличивается.


 
Calm ©   (2003-01-31 11:38) [3]


> Да брось... Иди день рождения отмечать :-)

Поздравляю!


 
Separator ©   (2003-01-31 11:46) [4]

Спасибо за поздравления :), но работать тоже надо.
2Calm
CountNaprs - просто переменная, которая инициализируется на OnCreate формы, а этот цикл работает в отдельном потоке, который создается намного позже инициализации CountNaprs. CountNaprs не меняется


 
Calm ©   (2003-01-31 11:51) [5]

Видимо проблемы в поточности...
CountNaprs объявлена в классе потока?


 
Separator ©   (2003-01-31 11:53) [6]

нет, в interface модуля


 
han_malign ©   (2003-01-31 11:54) [7]

Ну дак локализовать надо:
Закоментарь тело цикла и проверь поведение без рабочего кода, если цикл перестал глючить, то коментарь по очереди разные блоки цикла, а там все ясно станет.
Классический метод научного тыка...
З.Ы. Естественно с отключеной оптимизацией.


 
han_malign ©   (2003-01-31 11:57) [8]

За границу массивов ни где не выходишь?
Попробуй {$R+}...


 
Separator ©   (2003-01-31 11:57) [9]

без этого цикла все работает


 
Archon Kazansky ©   (2003-01-31 12:03) [10]

Похоже действительно в поточности.
Кстати, с Днем Рождения!


 
Separator ©   (2003-01-31 12:03) [11]

За граници массива начинает выходит какраз из-за того, что i принимет не те значения.

Если вот этот цикл закоментировать, то все продолжет работать нормально.

for l:= 1 to 8 do
begin
if arrDopTC[i, j].Inv then
begin
if Temp mod 2 <> 0 then
StBin[l]:= "1"
else
StBin[l]:= "1"
end
else
begin
if Temp mod 2 <> 0 then
StBin[l]:= "1"
else
StBin[l]:= "0"
end;
Temp:= Temp div 2
end;


 
igorkuz ©   (2003-01-31 12:11) [12]

Если у тебя этот цикл в потоке НЕЛЬЗЯ напрямую обращятся к свойсвам формы


 
Separator ©   (2003-01-31 12:23) [13]


> igorkuz ©

Ладно это понятно, но проблема то не в этом, или из-за этого происходит сбой в циклической переменной?


 
han_malign ©   (2003-01-31 12:40) [14]

а у тебя StBin случаем не [0..7]???

Кстати? при такой постановке задачи:
если это не ошибка
if Temp mod 2 <> 0 then
StBin[l]:= "1"
else
StBin[l]:= "1"
то

if(arrDopTC[i, j].Inv or((Temp or 1)<>0))
then StBin[l]:= "1"
else StBin[l]:= "0"
Temp:= Temp shr 1


если всетаки ошибка - то:

if(arrDopTC[i, j].Inv xor((Temp or 1)<>0))
then StBin[l]:= "1"
else StBin[l]:= "0"
Temp:= Temp shr 1


 
Separator ©   (2003-01-31 12:50) [15]

Спасибо, то была просто опечатка и она не как не влияла


 
han_malign ©   (2003-01-31 13:03) [16]

Проверь какие значения принимает l в этом цикле - оптимизатор мог сглюкнуть и сделать цикл от 7 до 0 (бывает с ним время от времени).
З.Ы. Кстати можно еще проще
if(arrDopTC[i, j].Inv)
then Temp:=not Par.Vkv
else Temp:=Par.Vkv;


 
Separator ©   (2003-01-31 13:15) [17]

Цикл с l я уже выкинул, проблема вроде исчезла, когда я CountNaprs - 1 заменил на 13, хотя в дебагере CountNaprs всегда равно 14


 
han_malign ©   (2003-01-31 13:58) [18]

сто-пудово в память срешь, явно переполнение массива...



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

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

Наверх




Память: 0.51 MB
Время: 0.022 c
3-28606
Я
2003-01-23 08:55
2003.02.10
Просто тема


1-28905
RomanaPro
2003-01-30 22:16
2003.02.10
Нет вывода


1-28735
Opryshok
2003-01-31 19:09
2003.02.10
Как изменить рисунок но кнопке Пуск/Start?


3-28594
Z-man7777
2003-01-25 10:52
2003.02.10
Выборка/сохранение из/ в базу любого файла


3-28651
Sterh
2003-01-22 18:16
2003.02.10
Net db