Главная страница
    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
4-69642
Term
2002-10-09 15:30
2002.11.21
Можно ли добиться сведения лучей монитора в одну точку


3-69129
dim-
2002-11-04 09:12
2002.11.21
А почему нельзя работать с IBQwery через Append(Edit) и Post?


6-69469
странно...
2002-09-25 17:09
2002.11.21
resolve dns address


6-69455
Vasechkin
2002-09-18 21:01
2002.11.21
Народ ну помогите же мне!!!!!!!!!!


1-69362
[NEW]Splinter
2002-11-10 10:40
2002.11.21
Как записать в exe-шник?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский