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

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

Работа с указателями не получается


Вова ©   (2013-11-09 10:50:00) 


vaR
  StartSource, StopSource: pByte;
  Delta: integer;
  b: Tbitmap;
  Start,ps: pInteger;
  M: TMass;
 
BEGIN
  Start          := b.ScanLine[b.Height - 1];
  StartSource := @M.Mass[x + y * M.Xsize]; //M.mass - array of byte;
..........


Почему вот это работает

if (StartSource + (p^) + Delta)^ = 255 then

а это нет:
(Start + (p^) + Delta) = $89FF1310;


DevilDevil   (2013-11-19 10:04:00) [1]

> Вова   (09.11.13 10:50) 

Я думаю проблема в том, что ты не понимаешь, как располагаются данные в битмапе. Строки битмапа идут снизу вверх, а не вверху вниз. Каждая строка выровнена на 4 байта.

Поэтому Start действительно указывает на начало битмапа. И для доступа к пикселю [X, Y] нужно Y переворачивать. Полагаю (p^) + Delta у тебя даёт отрицательное число


Ega23   (2013-11-11 14:45:00) [2]


> на 4 байта....или на 1 Integer.....на одну ячейку в общем.


На SizeOf(T)


Вова   (2013-11-11 14:35:00) [3]

на 4 байта....или на 1 Integer.....на одну ячейку в общем.


icWasya   (2013-11-11 14:14:00) [4]

С указателями, кроме {$POINTERMATH ON}, нужно учитывать, что если к указателю на байт прибавить единичку, то адрес изменится на один, а вот если к указателю на Integer прибавить единичку, то адрес изменится на четыре.


bems   (2013-11-10 17:03:00) [5]

потому что PByte объявлен с {$POINTERMATH ON} а PInteger без него
чтобы заработало можно сделать {$POINTERMATH ON} перед всеми этими операциями


sniknik   (2013-11-10 11:45:00) [6]

> Почему вот это работает
if (StartSource + (p^) + Delta)^ = 255 then
интересный вопрос... ответ - наверное потому что ты врешь. не будет это работать, с той же ошибкой какую приводишь для второго варианта.


вова   (2013-11-09 20:06:00) [7]

var
  StartTemplate, StopTemplate, p: pWord;


if (StartSource + (p^) + Delta)^ = 255 then

if (Start + (p^) + Delta)^ =255 then

[DCC Error] xxx.pas(2078): E2015 Operator not applicable to this operand type

в этих 2х строках разные только первые операнды, но первая всегда работает, а вторая нет.


ProgRAMmer Dimonych   (2013-11-09 17:44:00) [8]

Раз текста ошибки нет, спросим о том, как объявлена p. Чтобы исключить.


вова   (2013-11-09 16:01:00) [9]

Start^ = $89FF1310;

но так все замечательно присваивается

и если сделать ps := (Start + (p^) + Delta) ; ошибка будет таже


RWolf   (2013-11-09 13:48:00) [10]

$89FF1310 > MaxInt.


вова   (2013-11-09 10:54:00) [11]

ой (Start + (p^) + Delta)^ = $89FF1310;


вообщем суть ошибки в том что он отказывается прибавлять дельту во втором случае


Наверх

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