Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

У меня глюки


Separator ©   (2003-01-31 11:31:00) 


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


han_malign   (2003-01-31 13:58:00) [1]

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


Separator   (2003-01-31 13:15:00) [2]

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


han_malign   (2003-01-31 13:03:00) [3]

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


Separator   (2003-01-31 12:50:00) [4]

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


han_malign   (2003-01-31 12:40:00) [5]

а у тебя 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:23:00) [6]


> igorkuz ©

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


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

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


Archon Kazansky   (2003-01-31 12:03:00) [8]

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


Separator   (2003-01-31 12:03:00) [9]

За граници массива начинает выходит какраз из-за того, что 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;


Separator   (2003-01-31 11:57:00) [10]

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


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

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


han_malign   (2003-01-31 11:54:00) [12]

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


Separator   (2003-01-31 11:53:00) [13]

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


Calm   (2003-01-31 11:51:00) [14]

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


Separator   (2003-01-31 11:46:00) [15]

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


Calm   (2003-01-31 11:38:00) [16]


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

Поздравляю!


Calm   (2003-01-31 11:36:00) [17]

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

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

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


Delirium^.Tremens   (2003-01-31 11:35:00) [18]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо