Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Работа с функцией ptr,обработка массивов.

Автор: Andrewshkovskii 7.06.2007 3:03

Задание таково,в двумерной матрице просуммировать элементы ниже гл. диагонали.
Работать с указателями.
вот код

program test2;
uses crt;
const
n=3;
m=3;
var
a:array [1..n,1..n] of integer;
i,j:integer;
procedure SumEl (pa:pointer;n,m:integer);
type
pint= ^integer;
var
si,i,j,k:integer;
function PR(P:pointer):pint;
begin
PR:=ptr(seg(p^),ofs(p^)+(I*n+j)*SI);
end;
begin
k:=0;
si:=sizeof(integer);
for i:=1 to n do
for j:=1 to m do
begin
if i>j then
k:=k+pr(pa)^;
end;
writeln('Summa elementov nije gl. diagonali = ',k);
end;
begin
clrscr;
writeln('Vvedite massiv');
for i:=1 to n do
for j:=1 to m do
begin
write('A[',i,j,']=');
read(a[i,j]);
end;
writeln('Vash massiv');
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j],' ');
writeln;
end;
SumEl(@a,n,m);
readkey;
end.


Вот результаты выполнения :
Код
Vvedite massiv
A[11]=1
A[12]=2
A[13]=3
A[21]=4
A[22]=5
A[23]=6
A[31]=7
A[32]=8
A[33]=9
Vash massiv
1  2  3
4  5  6
7  8  9
Summa elementov nije gl. diagonali = 12


Видимо по памяти слишком далеко шагаю...

Автор: мисс_граффити 7.06.2007 3:27

надо так:

  function PR(P:pointer):pint;
begin
PR:=ptr(seg(p^),ofs(p^)+((I-1)*n+(j-1))*SI);
end;

Автор: Andrewshkovskii 7.06.2007 3:33

спасибо...а не могли бы Вы объяснить,почему так?(я просто лекций много пропустил,досдавал долги по физике.. :E,вот и не понимаю ничерта=( )

Автор: мисс_граффити 7.06.2007 3:36

Потому что твой указатель на массив - это указатель на элемент (1,1) {нумерация же не с 0 идет}.
По идее, для обращения к элементу 1,1 к нему ничего не надо прибавлять... а ты прибавляешь аж 4 шага (i=1, j=1, n=3 => i*n+j=4)
ну и с остальными элементами то же

Добавлено через 1 мин.
З.Ы. Если можно - на ты, а не на Вы lol.gif
я еще маленькая

Автор: volvo 7.06.2007 3:53

Может, конечно, я придираюсь, но все же лучше не полагаться на компилятор:

function PR(P:pointer):pint;
begin
PR:=PInt(ptr(seg(p^),ofs(p^)+((I-1)*n+(j-1))*SI));
end;

Если этого не сделать, то на новых версиях Паскаль-компиляторов программа не будет скомпилирована (FPC, в частности, дает ошибку)