Главная страница
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.025 c
3-28600
FAS
2003-01-18 01:12
2003.02.10
откуда и как инсталировать BDE


14-29080
Mischka
2003-01-21 13:13
2003.02.10
Программирование доказывает или отрицает существование Бога?


1-28925
Константин Григорьев
2003-01-31 11:22
2003.02.10
Как вытащить иконку?


1-28867
Гость из солнечной Алматы
2003-01-27 12:51
2003.02.10
Процентная похожесть строк.


1-28850
Ihtiandr
2003-01-29 18:24
2003.02.10
DataTimePicker