Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];

Вниз

Как передать в функцию как параметр двумерный динамический массив   Найти похожие ветки 

 
Faustov   (2002-11-10 17:54) [0]

Как передать в функцию как параметр двумерный динамический массив?
Делал так
type Matr = array of array of real
...
function Func(var A,B: matr): boolean;
...
При вызове функции выдает ошибку Invalid Pointer


 
MBo   (2002-11-10 17:57) [1]

a как объявлены a и B и сделано ли SetLength?


 
Faustov   (2002-11-10 18:39) [2]

2MBo

procedure TForm8.Button1Click(Sender: TObject);
var a,b: Matr;
i,j:integer;
begin
SetLength(a,N,N);
SetLength(a,N,N);
...
Func(a,b);
end;


 
Faustov   (2002-11-10 18:41) [3]

пардон, опечатался, вот так:

procedure TForm8.Button1Click(Sender: TObject);
var a,b: Matr;
i,j:integer;
begin
SetLength(a,N,N);
SetLength(b,N,N);
...
Func(a,b);
end;


 
Alex44   (2002-11-10 18:49) [4]

Ya dumayu, chto eto ochen" ne trivial"naya constructsiya.
Kogda Vy delaete SetLength(A, n), to ne ochevidno, chto vse elementy A[i] proinitializirovany, i kogda Vy delaete

for I := 0 to n-1 do SetLength(A[i], m);

mozhet vyskochit" access violation. Dazhe esli net, potom, pered SetLength(A, NewN) Vam pridetsya snachala

for I := 0 to n-1 do SetLength(A[i], 0);

dlya osvobozhdeniya pamyati. Mozhet, ya ne prav i Delphi podderzhivaet mnogomernye dynamic arrays? Kto znaet?

V lyubom sluchae, eto nemnogo nadumano, t.k. lyuboj massiv v dushe odnomeren. Mozhno opredelit"


type Matr = record
m, n: Integer;
Entries: array of real;
end


a luchshe dazhe


type Matr = class
private
Fm, Vn: Integer;
FEntries: array of real;
...
public
property n: Integer read Fn write SetN;
...
property Entrie[i, j: Integer]: real read GetEntrie write SetEntrie; default;
end;

procedure Matr.SetN(Value: Integer);
begin
if Value <> Fn then begin
Fn := Value;
SetLength(FEntries, Fn*Fm);
end;
end;

function Matr.GetEntry(i, j: Integer): real;
begin
// if invalid values are possible, insert range check here
Result := FEntries[(i-1)*(Fm-1) + J-1];
end;


Nu, i ne zabyt" SetLength(FEntries, 0) v Matr.Destroy;


 
Faustov   (2002-11-10 19:02) [5]

Alex44 думаю, не в том проблема
Кто-нибудь использовал многомерный динамич. массив в качестве параметра функции???


 
wssg   (2002-11-10 19:18) [6]

2Faustov
>SetLength(a,N,N);
>SetLength(b,N,N);
У SetLength вроде всего два параметра...

И вот простой пример использования динамического двумерного массива:

...
TArr = array of array of integer;
...
procedure TForm1.FillArr(var ar: TArr);
var i,j:integer;
begin
for i:=Low(ar) to High(ar) do
for j:=Low(ar[i]) to High(ar[i]) do
ar[i,j]:=Random(1000);
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:Tarr;
i,j:integer;
begin
SetLength(a,10);
for i:=Low(a) to High(a) do
SetLength(a[i],10);
FillArr(a);
for i:=Low(a) to High(a) do
for j:=LOw(a[i]) to High(a[i]) do
Memo1.Lines.Add(IntToStr(a[i,j])+" ");
end;


 
wssg   (2002-11-10 19:28) [7]

2Faustov
>SetLength(a,N,N);
>SetLength(b,N,N);

>У SetLength вроде всего два параметра...

Ошибся, SetLength(b,N,N); работает....

>При вызове функции выдает ошибку Invalid Pointer
А что в функции делается смотрели?


 
Fantasist   (2002-11-10 21:47) [8]

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

function f1(var a,b:TMatr):boolean;
begin
a:=b; //здесь
SetLength(a,7,7); //и здесь имеет значение есть ли модификатор var перед паметрами.
end;



function f1(a,b:TMatr):boolean;
begin
a[5,5]:=7; //здесь это значения не имеет. переданный массив измениться.
end;


 
Fantasist   (2002-11-10 21:52) [9]

Да совсем забыл.
Faustov : приведенный кусок кода ничего криминального не содержит. Покажи функцию.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
1-69428
Shrek
2002-11-11 12:33
2002.11.21
DBCtrlGrid


1-69264
poops66
2002-11-12 00:49
2002.11.21
lost *.dfm file


1-69399
Faustov
2002-11-10 17:54
2002.11.21
Как передать в функцию как параметр двумерный динамический массив


1-69401
Сатир
2002-11-06 19:24
2002.11.21
Найдите, пожалуйста, ошибку в алгоритме особождения ресурсов


1-69386
maxim2
2002-11-10 13:48
2002.11.21
Подскажите компонент типа Grid в котором можно устанавливать...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский