Помощь - Поиск - Пользователи - Календарь
Полная версия: Обработка массива с помощью функции 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
Я извиняюсь меред коллегами, каким-то образом я не заметил, что тема дублирована, и ответил в нее, хотя все уже было отвечено..

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

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