Консультация № 138773
31.05.2008, 11:02
0.00 руб.
0 3 3
Уважаемые Эксперты, помогите: как в процедуру передавать двумерный массив?

Обсуждение

Неизвестный
31.05.2008, 11:20
общий
это ответ
Здравствуйте, Nacho!

Напрямую двумерный массив передавать не получится, но Вы можете создать новый тип переменных - двумерный массив и уже переменную этого типа передавать. Покажу на примере:
<i>type MyArray=array[1..100, 1..200] of integer;
var Ar: MyArray;</i>
Дальше с переменной Ar Вы можете работать как с обычным двумерным массивом, кроме того появилась возможность передавать его как параметр для функции или процедуры:
<i>procedure work(Z:MyArray);</i>
Пример использования - в приложении.

Удачи!

Приложение:
program Project1;{$APPTYPE CONSOLE}uses SysUtils;type MyArray=array[1..100, 1..200] of integer;var Ar: MyArray;procedure work(var Z:MyArray);begin Z[1,1]:=123;end;begin work(Ar); writeln(Ar[1,1]); readln;end.
Неизвестный
31.05.2008, 17:35
общий
это ответ
Здравствуйте, Nacho!
C учетом дополнения в минифоруме - можно использовать динамические массивы (смотря в чем пишете, например в Turbo Pascal их нет, во Free Pascal и Delphi есть).
При их использовании учитывайте, что нумерация в них с 0.
Пример в приложении.

Приложение:
program Project2;type TMatrix = array of array of integer;procedure outmatrix(var a: TMatrix; n, m: integer);var i, j: integer;begin for i := 0 to n - 1 do begin for j := 0 to m - 1 do write(a[i][j], ‘ ‘); writeln; end;end;var matr1, matr2: TMatrix; i, j, n, m: integer;begin n := 2; m := 3; randomize; setlength(matr1, m); for i := 0 to m - 1 do setlength(matr1[i], n); for i := 0 to n - 1 do begin for j := 0 to m - 1 do matr1[i][j] := random(20); end; outmatrix(matr1, n, m); writeln; n := 3; m := 4; randomize; setlength(matr2, m); for i := 0 to m - 1 do setlength(matr2[i], n); for i := 0 to n - 1 do begin for j := 0 to m - 1 do matr2[i][j] := random(20); end; outmatrix(matr2, n, m); readln;end.
давно
Старший Модератор
31795
6196
05.06.2008, 13:25
общий
это ответ
Здравствуйте, Nacho!

Двумерный массив в памяти компьютера хранится в таком виде:
а<sub>11</sub>,а<sub>12</sub>,. . .,а<sub>1n</sub>,a<sub>21</sub>,a<sub>22</sub>,. . .,a<sub>2n</sub> и т.д.
Другими словами, это последовательность байт(слов) с адресом указывающим на элемент а<sub>11</sub> и количеством элементов N * M.
Все элементы считаются как смещение от начала этого массива(I * N + J)* длина одного элемента массива. При компиляции программы, именно адрес первого элемента передается в подпрограммы(процедуры и функции).
В Turbo Pascal есть стандарные средства, которые позволяют реализовать Вашу задачу.
1)<i>Предопределенный тип Pointer обозначает нетипизированный указатель (указатель который не указывает на какой-либо определенный тип).</i>
2)Указательные типы на переменые опрeделенного типа, к примеру такая запись : IntPtr=^Integer; будет указывать на переменную типа Integer длиной два байта.
3)Стадартные опрераторы, процедуры и функции для работы с указательными типами, с помощью которых Вы можете присвоить значение указательной переменной:
- процедур New или GetMem;
- оператора @ или функции Аddr;
- функции Ptr.
Все это показано в приведенной программе.
В функцию АА передается указатель на массив опредеделеного пользователем типа, но в самой функцие этот указатель принимается как нетипизированный, т.е. не привязанный к конкретному типу. В функции PTR этот указатель пересчитывается как указатель на целый тип, т.е. значение считанное или записанное с его помощью имеет длину два байта.
Удачи!

Приложение:
const n=5; m=6;type TMasA=array[1..n,1..n]of integer; TMasB=array[1..m,1..m]of integer;var a:TMasA; b:TMasB; i,j,aaa:integer;function AA(x:pointer;z:integer):integer; var s,i,j:integer;{используемые переменные} y:^Integer;{указатель на тип Integer} begin s:=0; for i:=1 to z do for j:=1 to z do if j>i then begin {считаем адрес указателя на элемент массива i,j} y:=ptr(seg(x^),ofs(x^)+2*(z*(i-1)+(j-1))); {суммируем со значением на которое указывает указатель} s:=s+y^; end; {присваиваем результат} AA:=s; end;begin {для массива А, создаем и выводим массив} aaa:=0; for i:=1 to n do begin for j:=1 to n do begin a[i,j]:=random(20); write(a[i,j]:3); if j>i then aaa:=aaa+a[i,j]; end; writeln; end; {выводим результат} writeln(AA(@a,n):6,aaa:6); {для массива В, создаем и выводим массив} aaa:=0; for i:=1 to m do begin for j:=1 to m do begin b[i,j]:=random(20); write(b[i,j]:3); if j>i then aaa:=aaa+b[i,j]; end; writeln; end; {выводим результат} writeln(AA(@b,m):6,aaa:6);end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа