Страница 1 из 1

работа с двумерным массивом в делфи

Добавлено: 19 ноя 2010, 23:19
kami46
суть задания заключается в том, что дана матрица НхМ. Требуется найти максимальный эл-т и поменять его местами с левым верхним (т.е. [1,1]). программа выдает ошибку Изображение
Variable 'max' might not have been initialized
Variable 'i1' might not have been initialized
Variable 'j1' might not have been initialized
Помогите, пожалуйста, разобраться, в чем же ошибка)

[syntax='Delphi']unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
n,m:integer;
implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
n:=strtoint(edit1.text);
m:=strtoint(edit2.text);
stringgrid1.colcount:=n;
stringgrid1.rowcount:=m;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i,j, max, i1, j1, BBuf : integer;
a:array of array of integer;
begin

setlength(a, n, m);

for i:=0 to n-1 do
for j:=0 to m-1 do
begin
a[i,j]:=strtoint(stringgrid1.Cells[i,j]);
end;

for i := 0 to n-1 do
for j := 0 to m-1 do
if a[i,j] > max then begin max :=a[i,j]; i1 := i; j1 := j end;

BBuf := a[0,0];
a[0,0] := a[i1,j1];
a[i1,j1] := BBuf;

for i:=0 to n-1 do
for j:=0 to m-1 do
stringgrid1.cells[i,j]:=inttostr(a[i,j]);
end;

end.[/syntax]

Re: работа с двумерным массивом в делфи

Добавлено: 22 ноя 2010, 09:57
BBB
Собственно, в приведенном тексте все сказано. Указанные переменные не всегда инициализируются. Т.е. возможна ситуация, когда программа использует их значения без предварительного присвоения этим переменным какого-либо значения.

Например, идет сравнение:
if a[i,j] > max then ....
Но max ранее ничему не присваивался. С чем сравниваем-то?

Re: работа с двумерным массивом в делфи

Добавлено: 23 ноя 2010, 17:05
Игорь Акопян
мне кажется что проблема скорее в обращении к ячейкам. Вы под отладчиком смотрели? Массив создался? Заполнился?
Вот кстати из хэлпа, про создание многомерного динамического массива:
You can create multidimensional dynamic arrays that are not rectangular. The first step is to call SetLength, passing it parameters for the first n dimensions of the array. For example,
var Ints: array of array of Integer;
SetLength(Ints,10);
allocates ten rows for Ints but no columns. Later, you can allocate the columns one at a time (giving them different lengths); for example
SetLength(Ints[2], 5);
makes the third column of Ints five integers long. At this point (even if the other columns haven't been allocated) you can assign values to the third column - for example, Ints[2,4] := 6.

The following example uses dynamic arrays (and the Borland.Vcl.SysUtils.IntToStr function declared in the SysUtils unit) to create a triangular matrix of strings.
var
A : array of array of string;
I, J : Integer;
begin
SetLength(A, 10);
for I := Low(A) to High(A) do
begin
SetLength(A, I);
for J := Low(A) to High(A) do
A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';
end;
end;

Re: работа с двумерным массивом в делфи

Добавлено: 15 дек 2010, 05:55
Oleg_Rus
Да, Игорь Акопян, как обычно прав, вы просто неправльно объявили динамический массив. Для его создания необходимо инициализировать сперва в одномерном пространстве и уже после этого в двумерном. Если рассматривать пример из хэлпика, то мы видим инициализацию первого уровня - SetLength(A, 10), затем "вытягиваем" массив в двумерной

for I := Low(A) to High(A) do //от начала одномерного массива до его конца устраиваем цикл
begin
SetLength(A, I); // начинаем "вытягивание", причем I - кол-во элементов в столбце
for J := Low(A) to High(A) do // и сразу производим заполнение столбца
A[I,J] := strtoint(stringgrid1.Cells[i,j]); // так будет примерно в вашем случае
end;

kami46 - надо внимательней слушать преподавателя или лучше искать источники )))