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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2016, 01:35   #1
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
Вопрос запись данных в массив

Код:
procedure TForm1.btn2Click(Sender: TObject);
type
 PRGBTriple = ^TRGBTriple;
 TRGBTriple = packed record
  b: byte; //легче для использования чем типа rgbtBlue...
  g: byte;
  r: byte;
 end;
 PRow = ^TRow;
 TRow = array[0..1000000] of TRGBTriple;
 PPRows = ^TPRows;
 TPRows = array[0..1000000] of PRow;
var
  x,y: integer;
  Bufer: PPRows;
  c: TBitmap;
begin
  c:= TBitmap.Create;
  c.PixelFormat:=pf24bit;
  c.LoadFromFile('1.bmp');
  Bufer[0]:=(c.ScanLine[0]);
end;
выдает ошибку 'c0000005 ACCESS_VIOLATION'.
почему? где косяк
помогите пожалуйста
Михаил22042016 вне форума Ответить с цитированием
Старый 29.05.2016, 01:44   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
почему? где косяк
переменная bufer не проинициализирована - содержит рандомный адрес.
двумерный статический таких размеров - это что-то!
Нафига? ФТОПКУ сразу! Ты чо там рожаешь ваще?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.05.2016, 01:58   #3
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
переменная bufer не проинициализирована - содержит рандомный адрес.
двумерный статический таких размеров - это что-то!
Нафига? ФТОПКУ сразу! Ты чо там рожаешь ваще?

размер не смотри,ЭТО блин просто с запасом сделано
хочу в этот массив запихать весь битмап через For
Bufer[y]:=c.ScanLine[y];
потом так юзать Bufer[10][25].r:=...;

как его еще инициализировать, в var записал же
Михаил22042016 вне форума Ответить с цитированием
Старый 29.05.2016, 02:16   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
размер не смотри,ЭТО блин просто с запасом сделано
хочу в этот массив запихать весь битмап через For
Bufer[y]:=c.ScanLine[y];
потом так юзать Bufer[10][25].r:=...;

как его еще инициализировать, в var записал же
я не буду тебе помогать делать говно из варенья: это же вредительство!
Убери массивы, совсем. Они не нужны тебе тут.
Цитата:
ЭТО блин просто с запасом сделано
Весь твой запас будет тупо память жрать и свопиться. Это же статический массив, ёмаё!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 29.05.2016 в 02:18.
min@y™ вне форума Ответить с цитированием
Старый 29.05.2016, 02:22   #5
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
я не буду тебе помогать делать говно из варенья: это же вредительство!
Убери массивы, совсем. Они не нужны тебе тут.

Весь твой запас будет тупо память жрать и свопиться. Это же статический массив, ёмаё!
а что тогда нужно, если не массив. А массив можно и уменьшить до размера фулАшДи

Код:
type
 PRGBTriple = ^TRGBTriple;
 TRGBTriple = packed record
  b: byte; //легче для использования чем типа rgbtBlue...
  g: byte;
  r: byte;
 end;
 PRow = ^TRow;
 TRow = array[0..1919] of TRGBTriple;
 PPRows = ^TPRows;
 TPRows = array[0..1079] of PRow;

Последний раз редактировалось Михаил22042016; 29.05.2016 в 02:27.
Михаил22042016 вне форума Ответить с цитированием
Старый 29.05.2016, 02:25   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Сначала расскажи, чо ты там сделать пытаешься.
Что на входе, что на выходе быть должно и т.д.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.05.2016, 02:38   #7
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Сначала расскажи, чо ты там сделать пытаешься.
Что на входе, что на выходе быть должно и т.д.
на входе картинка
которую обрабатываю реал тайм, оконтуриваю, контур получается не ахти, нагулил что перед оконтуриванием надо подготавливать картинку, вот и решил таким образом,считал картинку в массив изменил его как надо выплюнул на канву

если интересно что у меня там по результатам оконуривания выходит могу показать, через ютуб

Последний раз редактировалось Михаил22042016; 29.05.2016 в 02:48.
Михаил22042016 вне форума Ответить с цитированием
Старый 29.05.2016, 02:53   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Картинка (битмап) - это уже массив.
Так и юзай непосредственно его, не нужны тебе никакие левые массивы.
ScanLine[index] - это как раз указатель на 0-й TRGBTripple в строке битмапа (при формате цвета 24 бита), а index - это номер этой самой строки по вертикали.

Запомни, если ты объявляешь статический массив, то кусок памяти под него выделяется полностью, как только переменная попадает в область видимости! Это можно обойти костылём - созданием фейкового массива
Код:
 PRow = ^TRow;
 TRow = array[0..0] of TRGBTriple; // и отключить range-checking
но в твоём случае это только прибавит тебе проблем.

З.Ы. Ваще, я в этой области профан полный, у меня другая специализация. Если я чото не знаю или не уверен, я всегда открыто об этом заявляю.
Дождись утра, мож спецы подгребут и предложат что получше. Вся моя писанина выше - чисто моё имхо. Но 1хрен, голый Scanline работает быстрее других инструментов.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 29.05.2016 в 02:59.
min@y™ вне форума Ответить с цитированием
Старый 29.05.2016, 10:36   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Запомни, если ты объявляешь статический массив, то кусок памяти под него выделяется полностью, как только переменная попадает в область видимости!
Но у него же НЕТ описания статического массива.
Есть описание ТИПА. А это не означает ВЫДЕЛЕНИЕ памяти.

проверьте, сколько займёт памяти программка вида
Код:
type
 PRow = ^TRow;
 TRow = array[0..1000000] of Integer;

var 
  MyArrayPtr : PRow;
begin
  // 
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.05.2016, 10:42   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Но у него же НЕТ описания статического массива.
я знаю. предупредил просто.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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