давно
Старший Модератор
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.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.