Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > двумерный массив как параметр


Автор: physic 19.1.2005, 15:30
Не получается передать двумерный динамический (да и статический) массив в качестве параметра

MyFunc(A: array of array of real);
MyFunc(A: array[1..2,1..2] of real);

Что же неправильно?

Автор: Snowy 19.1.2005, 15:32
Передай указатель на массив.

Автор: physic 19.1.2005, 15:40
Snowy, а не мог бы ты показать, как это запишется? заранее благодарен

Автор: Snowy 19.1.2005, 16:22
Код

type
 TRealArray=array[0..9] of real;

var
 a: TRealArray;

function MyFunc(r: TRealArray):real;
begin
 result:=r[0]+r[1]-r[2];
end;

begin
 a[0]:=4.321; a[1]:=3.210; a[2]:=1.234;
 WriteLn(MyFunc(a));
 readln;
end.

Автор: EKoshelev 20.1.2005, 10:03
Можно ещё как поинтер передавать. Только это уже половое извращение.

Автор: Snowy 20.1.2005, 11:04
Я так и написал. Поинтер это и есть указатель.
Можно сделать и с указателем, но данное решение более понятно и удобней для работы.

Автор: Петрович 20.1.2005, 20:21
А в чем проблемма то.
У меня нормально транслируется такое:

Код

type
 tMyArray = array[1..2,1..2] of real;

procedure Test (a :tMyArray);
begin
 //
end;

Автор: Bes 21.1.2005, 07:26
Позволю себе обновить вопрос.
А как быть с динамическими массивами.

Автор: Петрович 21.1.2005, 09:50
Аналогично.
Код

type
tMyArray = array of array of real;

procedure Test (a :tMyArray);
begin
//
end;

Автор: Bes 21.1.2005, 11:28
2Петрович: Хм.... а у меня почему-то не получалось - попробую еще раз.

Автор: Петрович 21.1.2005, 11:58
Здесь важно что-бы было отдельное определение типа. Т.е. такое недопустимо:
Код

procedure Test (a :array of array of real);
begin
//
end;

Автор: Bes 21.1.2005, 13:38
2Петрович: Да, да видимо в этом и дело....

Автор: Дрюча 21.1.2005, 16:36
smile

Если в процедуре не надо менять массив, а, допустим надо посчитать сумму его элементов, и если этот массив одномерный, то пройдет и такое:

Код


function Sum(mass: array of integer):integer;
var
i:integer;
begin
Result:=0;
for i:=Low(mass) to High(mass)  do
 Result:=Result + mass[i];
end;


<...>
const
m = -12;
n = 123;

var
a:array [m..n] of integer;

begin
{Заполняем...}
ShowMessage(IntToStr(Sum(a)));
end;

Автор: Петрович 21.1.2005, 20:21
Цитата
function Sum(mass: array of integer):integer;
var
i:integer;
begin
Result:=0;
for i:=Low(mass) to High(mass)  do
Result:=Result + mass[i];
end;

В данном примере используется не динамический массив а открытый массив. Это немножко разные вещи.

Автор: Дрюча 21.1.2005, 21:03
Да, но если мы будем передавать этой функции динамический массив, то сработает!

Код

var
a:array of integer;

begin
SetLength(a, 12);
<...>
ShowMessage(IntToStr(Sum(a)));
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)