3 / 3 / 0
Регистрация: 26.11.2015
Сообщений: 170
1

Ошибки с большими массивами

17.10.2017, 02:47. Показов 778. Ответов 3
Метки нет (Все метки)

Нужно заполнить массив ссылками на пиксели. Если между try и except отнять 2 вместо 1 массив создастся но затем все равно вылезет ошибка. С малым фото (а значит малым массивом) проблем нет а значит дело в большом массиве. Убедиться в этом можно заменив ширину-1 высоту-1 на меньшие значения.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.HSSpeedButton3Click(Sender: TObject);
var
Pixel: Array of Array of ^TRGBTriple;
P: ^TRGBTriple;
begin
Image1.Picture.Bitmap.PixelFormat:=pf24bit;
P:=Image1.Picture.Bitmap.ScanLine[Image1.Picture.Height-1];   // сылка на нижний пиксель с лева
 
SetLength(Pixel, Image1.Picture.Width-1);   //создание
try
for X:=0 to Image1.Picture.Width-1 do SetLength(pPixel[X], Image1.Picture.Height-1);
except
showmessage(inttostr(X));
end;
 
for Y:=0 to Image1.Picture.Height-1 do   // заполнение массив
for X:=0 to Image1.Picture.Width-1 do begin
Pointer(Pixel[X, Y]):=Pointer(P);
inc(P);
end;
end;
Добавлено через 22 минуты
Массив не создавался потому что мешала -1 в SetLength(Pixel, Image1.Picture.Width-1) и он выходил за предел в цикле. Отредактировать нельзя поэтому перепишу правильно по новой.
Delphi
1
2
3
4
5
6
SetLength(Pixel, Image1.Picture.Width);   //создание
try
for X:=0 to Image1.Picture.Width-1 do SetLength(pPixel[X], Image1.Picture.Height-1);
except
showmessage(inttostr(X));
end;
Ошибка не пропала а значит вопрос в силе. Сталкиваюсь с этим в 3 раз, тогда помог вынос массива в глобальную переменную, а щас это ничего не дает. Стало быть потому что он здесь на много больше.

Добавлено через 59 минут
Сам не знаю как но ошибки больше нет а код тот же, просто создавал масивы разной длины и проверял через showmessage совпадения id ечеек и значения Х и Y после ошибки и убеждался что все правильно написано и в один момент обнаружил что ошибка перестала доставать хотя ни чего не менял в коде кроме строки for X:=0 to Image1.Picture.Width-1 do SetLength(pPixel[X], Image1.Picture.Height-1) там единица не нужна но это было сделано предварительно, после исправления все ровно была ошибка (проверку проводил после удаления 1).
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2017, 02:47
Ответы с готовыми решениями:

Работа с массивами - исправить ошибки
Проблема вот в чём: При компиляции ошибок не возникает, программа нормально начинает работать. Но...

Работа с большими массивами
Есть задача: получение санитарной зоны вокруг антенн, связи с особенностью решения задачи иного...

Работа с большими массивами
Бодрого дня. Есть ли какие секреты работы с большими массивами? Есть файл с 1.500.000 строк 1)...

Проблема с большими массивами
Добрый день. Есть проблема с большими массивами, помогите пожалуйста. Камень stm32f051k8t6 8кб...

3
5304 / 4147 / 1353
Регистрация: 14.04.2014
Сообщений: 18,902
Записей в блоге: 18
17.10.2017, 09:25 2
жесть
расход памяти просто гигантский будет. точнее - 1.3 к исходному. не имея никакого выигрыша перед доступом к оригиналу

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

Запись Pointer(Pixel[X, Y]):=Pointer(P); бессмысленна
имеет смысл
Pixel[X, Y]:=Pointer(P);
но и это непонятно зачем, когда у вас и элементы массива и P одного типа
0
3 / 3 / 0
Регистрация: 26.11.2015
Сообщений: 170
17.10.2017, 15:57  [ТС] 3
krapotkin
Экономия памети не всегда бонус к производительности, я раньшэ использовал Byte вместо Integer если не было нужды больше 256 и выяснилось что с Integer все работает быстрее на где то десеть процентов а ведь он больше byte который казалось бы использовать рациональнее.
Delphi
1
2
3
4
5
6
7
8
9
10
type
  StrokaArray = array[0..32767] of TRGBTriple;
  pStrokaArray = ^StrokaArray;
var
VsePixili : array of pStrokaArray;
i: Integer;
begin
for i:=0 to Image1.Picture.Height-1 do
VsePixili[i]:=Image1.Picture.Bitmap.Scanline[i];
end;
С таким подходом перерасхода не будет осталось проверить как быстро это будет работать, если медленнее то пусть перерасходывает в угоду скорости.
Запись Pointer(Pixel[X, Y]):=Pointer(P); бессмысленна
имеет смысл
Pixel[X, Y]:=Pointer(P);
Нет без поинтер работать не будет, проверьте сами.
0
5304 / 4147 / 1353
Регистрация: 14.04.2014
Сообщений: 18,902
Записей в блоге: 18
17.10.2017, 16:33 4
процессор работает с integer
чтобы получить байт, ему приходится занулять еще три
так что тут все ессно

scanline[i] находится с той же скоростью что и pixel[i]
остается только второй индекс
и тут выигрыш тоже не очень очевиден
так что ...
но померять конечно можно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2017, 16:33
Помогаю со студенческими работами здесь

Работа с большими массивами данных
Здравствуйте! Я работаю над курсовым проектом, в нём используется папка с данными. Они хранятся в...

Операции с большими массивами данных
Доброе время суток! Мне нужно оперировать большими объемами данных - массивы до 4 Гб....

Советы по оптимизации роботы с большими массивами.
Интересуют методы оптимизации работы с большими массивами Обрабатываются большие (несколько...

Как правильно работать с большими массивами?
Здоровый у меня массив. 30000 строк. И постоянно обновляется. Я его постоянно очищаю If...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru