![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с указателями не получается
Вова © (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;
вообщем суть ошибки в том что он отказывается прибавлять дельту во втором случае