Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена статических массивов на динамические. 
:(
    Опции темы
zzdxw
Дата 25.10.2014, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 6.10.2014

Репутация: нет
Всего: нет



Доброго времени суток!
Помогите, пожалуйста, заменить статические двумерные массивы на динамические двумерные. Никак не могу разобраться с SetLength...
Исходный код.
Код

const
  r_true=1;
  r_false=0;
  maxImageWidth = 2000;
  maxImageHeight = 2000;

type
  TRGB=record
    r,g,b:byte;
  end;

  ARGB=array [0..1] of TRGB;
  PARGB=^ARGB;

var
  Form1: TForm1;
  a:array[0..maxImageWidth,0..maxImageHeight] of byte;
  gx,gy,mr4:array[0..maxImageWidth,0..maxImageHeight] of double;
  BMPHeight,BMPWidth:integer;
  pixeldeleted:boolean;

implementation

{$R *.dfm}

procedure Sobel;
var
  i,j:integer;
begin
  for i:=1 to BMPWidth-1 do
    for j:=1 to BMPHeight-1 do
    begin
      gx[i,j]:=(a[i-1,j+1]+2*a[i,j+1]+a[i+1,j+1])-(a[i-1,j-1]+2*a[i,j-1]+a[i+1,j-1]);
      gy[i,j]:=(a[i+1,j-1]+2*a[i+1,j]+a[i+1,j+1])-(a[i-1,j-1]+2*a[i-1,j]+a[i-1,j+1]);
    end;
end;


procedure TForm1.N3Click(Sender: TObject);
begin
  if SavePictureDialog1.Execute then
  begin
    image1.Picture.SaveToFile(SavePictureDialog1.FileName);
  end;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
    image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    LoadInArray;
  end;
end;

procedure TForm1.N5Click(Sender: TObject);
var
  x,y:integer;
  val:integer;
  Ln:PARGB;
begin

  Sobel;

  for y:=1 to BMPHeight-1 do
  begin
    Ln:=form1.image1.Picture.Bitmap.scanline[y];
    for x:=1 to BMPWidth-1 do
    begin
      val:= round(sqrt(sqr(gx[x,y])+sqr(gy[x,y])));
      if val>255 then
        val:=255;
      Ln[x].b:=val;
      Ln[x].g:=val;
      Ln[x].r:=val;
    end;
  end;
  form1.Image1.Repaint;
end;

procedure TForm1.LoadInArray;
var
  Ln:PARGB;
  x,y:integer;
begin
  if image1.Picture.Bitmap.PixelFormat<>pf24bit then
    image1.Picture.Bitmap.PixelFormat:=pf24bit;

  BMPHeight:=image1.Picture.height;
  BMPWidth:=image1.Picture.width;
  for y := 0 to BMPHeight-1 do
  begin
    Ln := form1.image1.Picture.Bitmap.scanline[y];
    for x := 0 to BMPWidth-1 do
    begin
      a[x,y]:=(Ln[x].r+Ln[x].g+Ln[x].b) div 3;
    end;
   end;

PM MAIL   Вверх
Dremuk
Дата 25.10.2014, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.12.2009

Репутация: нет
Всего: нет



Например
a: array of array of byte; // Двумерный массив
.....
begin
  SetLength(a, maxImageWidth, maxImageHeight);
  .....
  for x := 0 to maxImageWidth - 1 do
    for x := 0 to maxImageWidth - 1 do
      a[x, y] := ...
  .....
  a := nil;
end

В отличии от статического массива, который всегда прямоугольный, размерность динамического массива может быть сложной. Тогда выделять память нужно следующим образом:
SetLength(M,5);     // Число строк
SetLength(M[0],4);  // Кол-во эл-ов в 1 строке
SetLength(M[1],1);  // Кол-во эл-ов в 2 строке
SetLength(M[2],3);  // Кол-во эл-ов в 3 строке
SetLength(M[3],2);  // Кол-во эл-ов в 4 строке
SetLength(M[4],5);  // Кол-во эл-ов в 5 строке
В результате массив будет следующим:
* * * *
*
* * *
* *
* * * * *

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
zzdxw
Дата 25.10.2014, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 6.10.2014

Репутация: нет
Всего: нет



К сожалению, ничего не выходит...(
Если заменить так все массивы, то либо не открывается изображение, либо не применяется функция Sobel.
PM MAIL   Вверх
CynicRus
Дата 25.10.2014, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: 2
Всего: 5



Не получается с динамическими массивами, замени на TList, если среда позволяет - на TList<T>.

PS: а если я правильно понял, что твоя задача работа с изображением, то вот как это делал я: https://github.com/CynicRus/dtmeditor/blob/...DTM_Bitmaps.pas
PM MAIL   Вверх
zzdxw
Дата 25.10.2014, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 6.10.2014

Репутация: нет
Всего: нет



Для меня это дремучий лес...
Если я скину исходники, где я попытался сделать динамические массивы, укажите на ошибки?

Это сообщение отредактировал(а) zzdxw - 25.10.2014, 14:47
PM MAIL   Вверх
CynicRus
Дата 25.10.2014, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: 2
Всего: 5



Вот как добавить элемент к динамическому массиву:
Код

function DynArrayAppend(var V: ByteArray; const R: Byte): Integer;
begin
Result := Length(V);
SetLength(V, Result + 1);
V[Result] := R;
end; 



А вот тоже самое, только к динамическому массиву добавить массив:
Код

function DynArrayAppendByteArray(var V: ByteArray; const R: array of Byte): Integer;
var L : Integer;
begin
Result := Length(V);
L := Length(R);
if L > 0 then
begin
SetLength(V, Result + L);
Move(R[0], V[Result], Sizeof(Byte) * L);
end;
end; 


Под свои типы данных перепили, да используй.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.