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

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

Непонятное изменение значения переменной


Вова ©   (2012-12-23 08:18:00) 

Есть функция

function DrawKontur(var QP: TQuickPixels; QPStart: TQuickPixels;
 x, y: integer): Boolean;
var
 Pixel1: Cardinal;
 Intensity: byte;
 matr: array [1 .. 3, 1 .. 3] of byte;
 i, j, x1, y1, x2, y2, x0, y0: integer;

begin

 DrawKontur := true; // пока не используется и всегда истина.

 if (x=0) or (y = 0) or (x = (QP.Width-1)) or (y = (QP.Height-1)) then
   exit;// на границах не считаем

 for i := (y - 1) to (y + 1) do
 begin
   for j := (x - 1) to (x + 1) do
   begin
     if (j < 0)  or (j > (QP.Width-1)) or (i < 0) or (i > (QP.Height-1)) then
     begin
         continue;
     end;

     x2 := (j - (x - 1));
     y2 := (i - (y - 1));
     x1 := ((j -(x - 1))-1);
     y1 := (i - (y - 1));

     Pixel1 := QPStart.GetPixels24(j, i);
     Intensity := getIntensity(Pixel1);
     matr[x2, y2] := Intensity;

      if x2 = 0 then
       continue;

   end;
 end;
end;


которую я пытаюсь заставить работать, но наткнулся на полтергейст: при входе в функцию с x = 1 и y = 1 (ну то есть при первом же заходе, при котором мы попадаем в цикл). Заходим в цикл и в первом проходе имеем i = 0,  но после выполнения matr[x2, y2] := Intensity; i вдруг становится равной 16711680, эта цифра напоминает значение переменной Pixel1 = 16777215 (Intensity = 255, x2=0,y2=0), а вопрос заключается в том что: КАК? и ПОЧЕМУ? и что делать?

Embarcadero RAD Studio XE, window 7 x64


Dimka Maslov   (2012-12-23 11:45:00) [1]

Включи проверку индекса массива и будет счастье.


Вова   (2012-12-23 09:46:00) [2]

matr: array [0 .. 2, 0 .. 2] of byte; да, оказывается дело в тос как объявлять массив.....


MBo   (2012-12-23 09:42:00) [3]

Индекс y2 (к примеру) уже на первом шаге становится 0, и matr[x2, y2] портит воздух за пределами матрицы
Со включенной опцией проверки диапазонов это можно было бы отловить сразу.

P.S. Внутренний if не нужен


Наверх

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