Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-21883
ikos
2002-09-26 09:14
2002.11.07
Активация MDI окна


3-21455
Robby
2002-10-21 14:11
2002.11.07
Щелчок правой кнопкой на DBGrid


4-21851
slipper
2002-09-21 13:39
2002.11.07
работа соперетивной памятью


14-21807
Oleg_Gashev
2002-10-20 04:07
2002.11.07
Вредно


1-21642
lena13
2002-10-25 17:31
2002.11.07
DriveComboBox DirectoryListBox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский