Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с функцией ptr,обработка массивов.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Andrewshkovskii
Задание таково,в двумерной матрице просуммировать элементы ниже гл. диагонали.
Работать с указателями.
вот код
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


Видимо по памяти слишком далеко шагаю...
мисс_граффити
надо так:
  function PR(P:pointer):pint;
   begin
    PR:=ptr(seg(p^),ofs(p^)+((I-1)*n+(j-1))*SI);
   end;
Andrewshkovskii
спасибо...а не могли бы Вы объяснить,почему так?(я просто лекций много пропустил,досдавал долги по физике.. :E,вот и не понимаю ничерта=( )
мисс_граффити
Потому что твой указатель на массив - это указатель на элемент (1,1) {нумерация же не с 0 идет}.
По идее, для обращения к элементу 1,1 к нему ничего не надо прибавлять... а ты прибавляешь аж 4 шага (i=1, j=1, n=3 => i*n+j=4)
ну и с остальными элементами то же

Добавлено через 1 мин.
З.Ы. Если можно - на ты, а не на Вы lol.gif
я еще маленькая
volvo
Может, конечно, я придираюсь, но все же лучше не полагаться на компилятор:
function PR(P:pointer):pint;
begin
  PR:=PInt(ptr(seg(p^),ofs(p^)+((I-1)*n+(j-1))*SI));
end;

Если этого не сделать, то на новых версиях Паскаль-компиляторов программа не будет скомпилирована (FPC, в частности, дает ошибку)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.