Форум: "Основная";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];
ВнизАсы !!! Вспомните начала программирования Найти похожие ветки
← →
ВАТ (2002-10-28 18:18) [0]У меня вдруг возникла проблема с циклом FOR x:=0 to XMAKS -2 do
XMAKS:= размер битого изображения загруженного в компонент TMAGE, допустим XMAKS=300. Операторы внутри цикла по теории должны выполниться (Кон знач - нач знач +1) т. е в наше случае 299 раз. Но у меня почему-то значение X увеличивается до 300 после чего возникает исключительная ситуация времени выполнения. Если кто сталкивался с такой ситуацией прошу помочь ее преодолеть.
← →
MBo (2002-10-28 18:24) [1]Такого не бывает. Код полнее приведи
← →
Dr_Mike (2002-10-28 18:25) [2]И что мы можем тебе ответить ?
Какого типа х ??? Что происходит с ним в цикле ??? Какая ошибка времени исполнения ???
И в конце концов, почему 299 ? По твоему же примеру получается 300-0+1 = 301 раз ???
Ну что на это ответить ???
← →
Gluka (2002-10-28 18:26) [3]Напиши свой натурал код...
← →
TTCustomDelphiMaster (2002-10-28 18:36) [4]
> допустим XMAKS=300
допустим XMAKS>300
← →
Николай Быков (2002-10-28 18:46) [5]Ну раз вы молчите то я попробую предугадать все возможные ошибки.
Var x:integer;
............
begin
for x:=0 to XMAKS-1 do
begin
{тута лучше не делать чего-нибудь с переменой x, что может привести к присвоению этой переменной значения больше, чем 300. Не присваиать переменной х дробных/символьных значений}
end;
end;
Вот так если XMAKS=300, то цикл выполнится 300 раз, а переменная x пробежит значения от 0 до 299
ЗЫ
А ты уверен, что не забыл присвоить переменной XMAKS какое-нибудь значения до начала цикла?
← →
Андрей Прокофьев (2002-10-28 18:53) [6]2 Николай Быков © (28.10.02 18:46)
>> {тута лучше не делать чего-нибудь с переменой x, что может >>привести к присвоению этой переменной значения больше, чем >>300. Не присваиать переменной х дробных/символьных значений}
:)
Это даже НЕВОЗМОЖНО сделать, компилятор выдаст ошибку.
>> Вот так если XMAKS=300, то цикл выполнится 300 раз, а >>переменная x пробежит значения от 0 до 299
в конце цикла x = 300
← →
Николай Быков (2002-10-28 19:02) [7]2 Андрей Прокофьев
А вы проверьте это сначала.
Пременная х не может быть 300, как мы делаем цткл от 0 до 300-1.
Еще ни разу не выдавал ошибку компилятор на такой код
for i:=0 to 2 do
i:=i*10;
← →
McSimm (2002-10-28 19:07) [8]>Еще ни разу не выдавал ошибку компилятор на такой код
И не выдаст ни разу. Если ни разу не попробовать
:)
← →
LongIsland (2002-10-28 19:13) [9]
> Николай Быков © (28.10.02 19:02)
Внутри цикла for ... to ... do изменение переменной цикла ЗАПРЕЩЕНО!!!
← →
Андрей Прокофьев (2002-10-28 19:13) [10]2 Николай Быков © (28.10.02 19:02)
for i := 0 to 300-1 do
;
ЦИКЛ ВЫПОЛНИТСЯ 300 раз 0..299, А
ПО ВЫХОДУ ИЗ ЦИКЛА X БУДЕТ РАВЕН 300.
>> Еще ни разу не выдавал ошибку компилятор на такой код
>> for i:=0 to 2 do
>> i:=i*10;
Проверьте! Error Assignment to FOR-loop variable i
← →
Андрей Прокофьев (2002-10-28 19:14) [11]2 ALL
>> ЦИКЛ ВЫПОЛНИТСЯ 300 раз 0..299, А
>> ПО ВЫХОДУ ИЗ ЦИКЛА X БУДЕТ РАВЕН 300.
или, строго говоря, значение X не определено?
← →
LongIsland (2002-10-28 19:21) [12]Может все-таки на код глянуть? Чесно говоря, в башке не очень укладывается такая ситуация:-) Если только не глюк:-)
← →
Андрей Прокофьев (2002-10-28 19:23) [13]Автор ветки, Вы где?
← →
ВАТ (2002-10-28 21:08) [14]Тут кто-то сказал не может быть, я тоже так думал. По просьбе зрителей предлагаю полностью текст процедуры.
TPixel=class(TObject)// ОПРЕДЕЛЯЕМ КЛАССЫ
FX,FY,Numer:integer;//координаты и номер точек
constructor Create(X,Y,num:integer);
end;
TPixFragment=class(TList)
FW:single;
FS:array of integer;
constructor Create(FWW:Single;FSS:array of integer;FB:boolean);
end;
constructor TPixel.Create(X,Y,Num:integer);
begin
inherited Create;
Fx:=x;
FY:=y;
Numer:=Num;
end;
constructor TPixFragment.Create(FWW:single;FSS:array of integer);
begin
inherited Create;
FW:=FWW;
FS:=FS;
end;
Загружаем черно-белое изображение
procedure _Code(bitmap:TBitmap;fSelx1,fSely1,fSelx2,fSely2:integer;Sender:TObject);
//fSelx1,fSely1,fSelx2,fSely2 размер Bitmap по координатам X, Y
var
PixList:array of TList;
Fragment:array of array of TPixFragment;
Coll: array of integer;
PixNum:integer;//номер точек
Pix1,Pix2,Pix3,Pix4:TPixel;//список точек черного цвета
Pix11,Pix22,Pix33,Pix44:TPixFragment;//список точекч черного света
col,row:integer;
ppx:pRGB;
t:boolean;
i,f,g,k,j,h,u:integer;
fww:single;
FSS:array of integer;
begin
Загружаем изображение и определяем цвет каждого пикселя
PixNum:=0;// количество точек в списке
//определяем размер массивОВ и создаем списки размером по величине КООРДИНАТы X
h:=trunc(fSelY2/2+1);
SetLength(Coll,h);
SetLength(PixList,fSelX2);
for col:=0 to fSelX2 do begin
PixList[col]:=TList.Create;// создаем первый список точек (PixList)
end;
// сканируем оттиск отбираем черные точки в списки (PixList)(получаем столбцы по координате Y)
for row:=fSelY1 to fSelY2 do begin
ppx:=bitmap.ScanLine[row];
inc(ppx,fSelX1);
for col:=fSelX1 to fSelX2 do begin
if ppx^.r<170 then begin // выбераем точки определенного цвета.
PixList[col].Add(TPixel.Createcol,row,PixNum)); //список точек черного цвета изображения
inc(PixNum);//число точек
end;
inc(ppx);
end;
end;
//из созданных списков (PixList)создаем следующие списки (Fragment)по следующему алгоритму растояние между точками в списках (PixList)по координате Y равно 1
t:=false;
Fww:=0;
Fss:=Nil;
SetLength(Fragment,bitmap.Width,h);
for i:=fSelX1 to fSelX2 do begin
g:=0;//номер номер списка
for f:=0 to PixList[i].Count - 2 do begin
Pix1:=PixList[i].Items[f];
if not t then begin //создаем первый список (Fragment)
t:=true;
Fragment[i][g]:=TPixFragment.Create(FWW,FSS,false);
SetLength(Fragment[i][g].FS,10);// размер массива
Fragment[i][g].Add(Pix1); //добавляем первую точку
end;
Pix2:=PixList[i].Items[f+1];
if (Pix2.Fy-Pix1.Fy=1) then begin
Fragment[i][g].Add(Pix2); //добавляем вторую точку
end else begin
t:=false;
inc(g);
end;
end;
Coll[i]:=g;// число списков (Fragment)
t:=false;
end;
// в этом месте сравниваем созданные списки (Fragment)расположенные на расстоянии = 1 по координате Y. и определяем переменную S, признак того, что рядом со списком(массивом точек черного цвета)(Fragment)[u][g] находится список (массив точек черного цвета)(Fragment)[f][k].сканируем все изображение
//определяем S
//первый столбец
for u:=fSelX1 to fSelX2-2 do begin //в этом цикле возникает ошибка //U становится больше значения fSelX2-2 хотите верте хотие нет
for g:=0 to Coll[u]-1 do begin // перебор списков
j:=0;
Pix1:=Fragment[u][g].First;
Pix2:=Fragment[u][g].Last;
if Fragment[u][g].Count > 1 then begin //
Fragment[u][g].FW:=(Pix1.FY+Pix2.FY)/2; //средняя координата точек в списке
end else begin Fragment[u][g].FW:=Pix1.FY
end;
//второй список
f:=u+1;
for k:=0 to Coll[f]-1 do begin // перебор фрагментов второго списка
// здесь возникает исключительная ситуация т к при U >fSelX2-2 список(Fragment[f][k]) не создан
Pix3:=Fragment[f][k].First;
Pix4:=Fragment[f][k].Last;
If not Fragment[f][k].FB then begin
if ((Pix1.FY>=Pix3.FY)and(Pix1.FY<=Pix4.FY))or((Pix1.FY<Pix3.FY)and(Pix2.FY>Pix4.FY))
or ((Pix2.FY>=Pix3.FY) and (Pix2.FY<Pix4.FY)) then begin
{список с номером "g" указывает на список
с номером "k"}
Fragment[u][g].FS[j]:=k;//
inc (j);
Fragment[f][k].FB:=true;
end;
end;
end;
end;
end;
end;
Наверно понятно,
Копиляция проходит без ошибок нет несообщений не предупреждений,
Во время работы приложения в среде возникает ошибка.
Содержание ошибки reised exception class EAccessViolation with messege "Access Violation at address 00401D1A in module "". Write of address 00410724". Process stopped. Use Step on Run to continue."
← →
Андрей Прокофьев (2002-10-28 21:14) [15]Первое, что бросилось в глаза
constructor TPixFragment.Create(FWW:single;FSS:array of integer);
begin
inherited Create;
FW:=FWW;
FS:=FS;
end;
← →
ВАТ (2002-10-28 21:21) [16]подругому не получается, возникает ошибка при компиляции
← →
Андрей Прокофьев (2002-10-28 21:22) [17]Зачем тогда передавать FSS?!
← →
LongIsland (2002-10-28 21:25) [18]Такое может быть, если fSelX1 > fSelX2-2 с самого начала
← →
ВАТ (2002-10-28 21:29) [19]представтье на столе лежат рядом две спички №1 и №2, а если рядом с первой лежит еще спичка №3, вот имассив FS показывает что рядом с первой спичкой находится одна, две ли допустим 3 и т д
← →
LongIsland (2002-10-28 21:34) [20]
> ВАТ (28.10.02 21:29)
Чего?:-) Такое на ночь говорить?:-)
Я вспомнил, что у меня возникала подобная ошибка. Судорожно переворачиваю исходники в поисках той программы...
← →
ВАТ (2002-10-28 21:48) [21]Fselx1 не может быть > fSelX2 т к это начальная и конечная координата рисунка
← →
LongIsland (2002-10-28 21:50) [22]
> ВАТ (28.10.02 21:48)
А такой ошибки тоже не может быть:-)
← →
ВАТ (2002-10-28 22:05) [23]Нет ошибка возникает постоянно
господа будем считать это домашним задание на ночь, может быть из за большого числа списков > 1000 и их рамеров может происходить переполнение стека и т п . С уважением Вячеслав
← →
icWasya (2002-10-29 10:57) [24]во первых
type Array_Of_Integer=array of integer;
во вторых
...
type TPixFragment=...
constructor Create(FWW:single;FSS: array of integer);override
FS:Array_Of_Integer; ...
в третьих
constructor TPixFragment.Create(FWW:single;FSS: array of integer);
begin
inherited Create;
FW:=FWW;
FS:=copy(FSS,Low(FSS),High(FSS));
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c