Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.01 c
1-28703
Миша444
2003-01-31 11:19
2003.02.10
Печать и просмотр..


14-28993
Igor_thief
2003-01-26 15:29
2003.02.10
StringGrid


1-28883
Zelius
2003-01-30 17:19
2003.02.10
Знатокам библиотеки KOL!


7-29113
arc
2002-12-04 15:38
2003.02.10
Из памяти на диск


1-28755
race1
2003-02-01 11:28
2003.02.10
vcl50





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский