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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2016, 08:44   #11
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Первый ответ правильный. Переменная буфер действительно не проинициализирована, она служит для хранения указателя на массив ПРоу, и в момент выполнения указывает на мусор, обращение к 0-му элементу массива на запись - это попытка записать через нерабочий указатель данные в память, на которую указывает указатель (а не в массив, которого в данном случае ещё никакого нет), а при мусорном указателе (мусорном значении переменной-указателя) очень вероятно, что натыкаетесь на защиту страницы памяти (хуже, если не натнкётесь, втихую портить чужую память).
Чтобы этого не было, и я полагаю, то, чего Вы хотели добиться - надо получить копию данных битмапа, и сделать это в своё некое хранилище, таковым должен быть либо массив (явно созданный), либо ещё какая списочная структура, хранящая список указателей (элементов типа ПРоу). Для явного создания массива надо взять либо динамический массив, либо указатель на массив и выделить память под него, в крайнем случае можно взять и статический (но рисунки же разной высоты предполагаются, придётся брать с запасом и заводить параметр кол-ва реальных данных). Лучше всего в данном случае динамический массив, ибо автоуправление памятью и нет мороки статического, достаточно вызвать SetLength(buffer, c.Height); после чего уже можно работать с ячейками массива на запись.
phomm вне форума Ответить с цитированием
Старый 10.06.2016, 16:44   #12
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Лучше всего в данном случае динамический массив, ибо автоуправление памятью и нет мороки статического, достаточно вызвать SetLength(buffer, c.Height); после чего уже можно работать с ячейками массива на запись.
я не мастер делфи, спорить не стану, но я все делаю через ScanLine, а динамический массив подойдет на сколько мне известно только для BitMap.Canvas.Pixels[x,y]... а это долго в сравнении с ScanLine.
___________________________________ _______________
задавать длину такого массива (для примера) у меня не получается, выдает ошибку.
Код:
type
  tXarray = array of PixelRGB;
  Xarray = ^tXarray;
var buf: Xarray; 
  SetLength(buf,Cel.BitMap.Width-1);
___________________________________ _______________
поэтому я сделал так:

Код:
type
  PixelRGB = packed record b,g,r: byte; end;
  tXarray = array[-2..2] of PixelRGB;
  Xarray = ^tXarray;
  tYXarray = array of Xarray;  // тут без этой галочки ^



var  buf: tYXarray;
  SetLength(buf,Cel.BitMap.Height-1);
  for y := 0 to Cel.BitMap.Height-1 do       
  begin
    buf[y]:= Cel.BitMap.ScanLine[y];   // записываю в буфер
  end;
а так пользую
Код:
buf[y][x].r:=G;
buf[y][x].g:=G;
buf[y][x].b:=G;
удобно, почти как BitMap.Canvas.Pixels[x,y], но быстрее
лучше этого из стандартных средств ничего не знаю

Последний раз редактировалось Михаил22042016; 10.06.2016 в 17:01.
Михаил22042016 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись данных в массив структуры Небожитель Общие вопросы C/C++ 5 30.05.2014 22:37
Запись данных массив<->Excel andbrother Microsoft Office Excel 30 13.12.2013 13:01
Запись данных из базы в массив rafffkaaa БД в Delphi 2 10.03.2013 14:53
запись данных в массив + цикл ассемблерной вставкой ahz4et Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 16.01.2011 11:10
Запись в массив данных бинарного дерева m9yt Общие вопросы C/C++ 2 14.03.2010 12:49