Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2009, 17:27   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Указатели. Объясните пожалуйста на примере scanline.

Никогда не любил указатели...

Но время пришло...

Допустим есть такой тип:
Код:
type
  TRGB=record
    B,G,R:Byte;
  end;
  pRGB=^TRGB;
var
  dest:pRGB
begin
  Dest:=Bmp.ScanLine[y];
В моём понимании мы забиваем строку У в указатель. Но она же не массив=\

Я думаю так:
Dest - просто указатель на адрес памяти (по сути просто адрес памяти)
а Dest^ - значение в этой памяти

Поправьте меня пожалуйста, если я ошибаюсь, и если можно, то небольшой примерчик работы с ScanLine (Всё думал куда тему запостить: в мультимедию или сюда, но т.к. тут в основном указатели, то решил сюда)

Как получить например пятый пиксель в строке У используя указатель?
Или Dest - Это адрес первого пикселя, а dest+1 второго. Т.е. по сути программы выделяет память и забивает туда строку? Т.е. тот же самый массив получается...

Спасибо за то, что хоть дочитали пост до конца
TwiX вне форума Ответить с цитированием
Старый 04.10.2009, 21:41   #2
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Все ты правильно понял.
Dest это по сули просто число - адрес памяти. Можещь провести вот такой эксперемнет
Код:
MessageBox(IntToStr(Integer(Dest));
Inc(Dest);
MessageBox(IntToStr(Integer(Dest));
Число увеличится, но не на 1 а на Sizeof(TRGB) (размер записи)

Есть еще вот такой способ работы с указателем:
Код:
type
  TRGB=record
    B,G,R:Byte;
  end;
  PRGBLine = ^TRGBLine;
  TRGBLine = array[0..65535] of TRGB;
var
  dest:PRGBLine;
begin
  Dest:=Bmp.ScanLine[y];
  Dest[i].R := 0;
  Dest[i].G := 255;
  Dest[i].B := 127;
Те. Мы представи участок памяти как массив. только пусть 65535 тебя не обманывает - реальная длинна сассива это ширина сканлайна, вылезь хоть не байт, последствия могут быть фатальны.
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 04.10.2009, 22:58   #3
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Спасибо большое.
Жалко два раза подряд нельзя плюс ставить)

По сути - это как массивы в c++ =)

Последний раз редактировалось TwiX; 04.10.2009 в 23:06.
TwiX вне форума Ответить с цитированием
Старый 19.10.2009, 12:24   #4
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Маленькая поправка во втором примере:
Код:
  Dest^[i].R := 0;
  Dest^[i].G := 255;
  Dest^[i].B := 127;
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уважаемые! Помогите пожалуйста заполнить вторую часть таблицы в примере) Лука Microsoft Office Excel 0 07.07.2009 16:12
объясните пожалуйста Arcueid1691 Паскаль, Turbo Pascal, PascalABC.NET 9 11.06.2009 20:59
объясните, пожалуйста brainstorm Помощь студентам 10 14.10.2008 23:49
Объясните пожалуйста TheHerd Паскаль, Turbo Pascal, PascalABC.NET 12 04.04.2008 21:33