Помощь - Поиск - Пользователи - Календарь
Полная версия: Обработка массива с помощью функции ptr
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Andrewshkovskii
Доброго времени суток всемsmile.gif
Задание : "Удалить задданую строку из матрицы 3х4 и уплотнить матрицу"

проблема в том,что я не понимаю как обратить к i+1 элементу матрицы через ptr?..
вот код..

program z1;
 uses crt;
 const
  n=3;
  m=4;
 var
 a:array [1..n,1..m] of integer;
 i,j,q:integer;


 procedure dels (pa:pointer;n:integer;m:integer);
  type
   pint= ^integer;
  var
   si,i,j,k:integer;
  function PR(P:pointer):pint;
   begin
   PR:=ptr(seg(p^),ofs(p^)+((i-1)*n+(j-1))*SI);
   end;
  begin
   si:=sizeof(integer);
   writeln('Vvedite stroky kot. hotite ydalit');
   readln(k);
   for i:=k to n do
    begin
     for j:=1 to m do
     {pr(pa)^:=pr(pa+1)^; вот тут и проблема...я знаю что так прибавлять нельзя,просто для примера написал.}
    end;

   end;

 procedure workingP;
  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-1 do
    begin
     for j:=1 to n do
     write(a[i,j],'  ');
     writeln;
    end;
     Dels(@a,n);
   readkey;
   end;
   begin
    workingp;
   end.
мисс_граффити
blink.gif
сам же пользуешься конструкцией
PR:=ptr(seg(p^),ofs(p^)+((i-1)*n+(j-1))*SI);

просто ставь вместо i - i+1
или в чем проблема?

а присваивать так нельзя не из-за +1
Andrewshkovskii
не пойму..извините,Просто целый день ешё другу писал программу,просто у него задолжность ввиде практики,не сдаст завтра задание - отчислят..Вот выживаю.Динамические сктруктуры сделал,а с этим опять застрял.
Я меняю i-1 на i+1,но не пойму как надо потом обратиться ,что бы заменились строки?..
Код
function PR(var P:pointer):pint;
begin
PR:=ptr(seg(p^),ofs(p^)+((i+1)*n+(j-1))*SI);
end;
begin
si:=sizeof(integer);
writeln('Vvedite stroky kot. hotite ydalit');
readln(k);
for i:=k to n do
  begin
   for j:=1 to m do
   pr(pa)^:=ptr(seg(p^),ofs(p^)+((i+1)*n+(j-1))*SI);
  end;

пробывал так,ошибку пишет,что не известе ему p^...
volvo
Так не проще:
program z1;
uses crt;
const
  n = 3;
  m = 4;
type
  tv = array[1 .. m] of integer;
var
  a: array[1 .. n] of tv;

procedure dels(pa: pointer; n, m: integer);
  type
    ptv = ^tv;

  function pr(p: pointer; i: integer): ptv;
  begin
    pr := ptv(ptr(seg(p^),ofs(p^)+(i-1)*sizeof(tv)));
   end;

  var i, k: integer;

  begin
    writeln('Vvedite stroky kot. hotite ydalit');
    readln(k);
    for i:=k to n do
      pr(pa, i)^ := pr(pa, i + 1)^;
  end;

procedure workingP;
var i, j: integer;
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 do');
  for i:=1 to n do begin
    for j:=1 to m do
      write(a[i,j],'  ');
    writeln;
  end;
  Dels(@a,n,m);

  writeln('Vash massiv posle');
  for i:=1 to n - 1 do begin
    for j:=1 to m do
      write(a[i,j],'  ');
    writeln;
  end;

  readkey;
end;

begin
  workingP;
end.


?
Lapp
Цитата(Andrewshkovskii @ 15.11.2007 0:41) *

не понимаю как обратить к i+1 элементу матрицы через ptr?..

Не понимаю, почему ты вдруг затруднился.. Ты же уже сделал то же самое в теле функции Pa!
  function PR(P:pointer):pint;
   begin
   PR:=ptr(seg(p^),ofs(p^)+((i-1)*n+(j-1))*SI);
   end;

Нужно сделать точно так же: взять сегмент и оффсет и прибавить SI к оффсету.

Важное замечание:
Когда производишь действия над указателями, нужно следить, чтоб оффсет оставался в пределах нормы, то есть от 0 до 65535. Если сумма (или разность) вышла за эти границы, то нужно подкорректировать значение сегмента. Каждая единица в сегменте соответствует 16 в оффсете. Иначе говоря, вот эти адреса эвивалентны:
(10 : 40) = (11 : 24) = (12 : 8)

В данном твоем случае выхода за границы скорее всего не произойдет, поскольку указатели в массиве обычно нормированы. Но я бы на это не надеялся. Рекомендую перед сложением производить нормировку адреса (приводить к виду с максимальным значением сегмента).

И еще одно: почему бы не воспользоваться move?
Lapp
Я извиняюсь меред коллегами, каким-то образом я не заметил, что тема дублирована, и ответил в нее, хотя все уже было отвечено..

М
Объединяю оба варианта темы.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.