Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
ВнизУ меня глюки Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c