IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Обработка массива с помощью функции ptr, опять проблема..
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Доброго времени суток всем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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


blink.gif
сам же пользуешься конструкцией
PR:=ptr(seg(p^),ofs(p^)+((i-1)*n+(j-1))*SI);

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

а присваивать так нельзя не из-за +1


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


не пойму..извините,Просто целый день ешё другу писал программу,просто у него задолжность ввиде практики,не сдаст завтра задание - отчислят..Вот выживаю.Динамические сктруктуры сделал,а с этим опять застрял.
Я меняю 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^...

Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Так не проще:
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.


?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.10.2020 23:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name