Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Использование директивы Absolute


Автор: merfol 20.12.2008, 22:52
Просто никогда не пользовался absolute, суть задачи: дан двумерный массив с отрицательными и положительными числами, надо найти среди них два наименьших среди положительных и поменять их местами, и потом найти среди отрицательных два наибольших и поменять местами и их. В программе обязательно нужно использовать function, absolute.     Оч срочно нужно  smile 

Автор: navi 20.12.2008, 23:58
Цитата(merfol @  20.12.2008,  22:52 Найти цитируемый пост)
absolute

не слыхал о такой!!!!

Автор: Majar 21.12.2008, 00:11
Цитата

Цитата

absolute


не слыхал о такой!!!! 

Как о функции и никто не слыхал, потому что absolute - это зарезервированное слово, которое используется для объявления так называемых абсолютных переменных:
Код

var
 p: type absolute Seg:Ofs;

где type - стандартный или ранее объявленный тип переменной, а Seg:Ofs - соответственно сегмент и смещение, определяющие адрес памяти, по которому будет размещена переменная p.

Но причем здесь двумерный массив?! Может имеется ввиду описать свою функцию с именем absolute? Но она вероятно будет конфликтовать с зарезервированным словом...в общем ждем пояснений автора вопроса
 

Автор: Dobermann 21.12.2008, 03:22
Цитата(merfol @  20.12.2008,  22:52 Найти цитируемый пост)
В программе обязательно нужно использовать function, absolute.

Абсолютом вроде как задают переменную, ссылающуюся на адрес другой переменной...

Автор: volvo877 21.12.2008, 09:42
Цитата(Majar @  20.12.2008,  23:11 Найти цитируемый пост)
Но причем здесь двумерный массив?!
При том, что задача - работать с двумерным массивом.  Или ты думаешь, что двумерный массив не подпадает под определение 
Цитата(Majar @  20.12.2008,  23:11 Найти цитируемый пост)
стандартный или ранее объявленный тип переменной
? Что именно запрещает совместно использовать двумерный массив и Absolute? Как? Думай, если бы это было так просто, вопроса бы не было...

Кстати, Absolute - это не только объявление переменной, 
Цитата(Majar @  20.12.2008,  23:11 Найти цитируемый пост)
где type - стандартный или ранее объявленный тип переменной, а Seg:Ofs - соответственно сегмент и смещение, определяющие адрес памяти, по которому будет размещена переменная p.
, а еще и объявление вида:
Код
var
  var_name: type_name absolute another_var;
, то есть описание переменной, накладывающейся на другую переменную.

Как вариант решения задачи:
Код
procedure p(var v; m, n: integer);
type arrtype = array[1 .. (2 * maxint) div sizeof(integer)] of integer;
var arr: arrtype absolute v;
begin
  for i := 1 to m * n do begin
    { работаем с переданной матрицей, как с одномерным массивом }
  end;
end;


Идея понятна? В процедуру (я на самом деле не понимаю, зачем тут нужна функция, в задаче не нужно ничего возвращать, только произвести какие-то действия) передается матрица любого размера, хоть 2*3, хоть 120*15, и на нее внутри процедуры накладывается одномерный массив максимально возможного размера, так что зная размер матрицы мы прекрасно сможем пробежаться по всему этому массиву (ну, какая разница, искать минимальный среди положительных в массиве, или в матрице? В массиве еще проще: надо хранить один, а не 2 индекса) и сделать все, что нужно...

Автор: Majar 21.12.2008, 16:47
Цитата(volvo877 @  21.12.2008,  09:42 Найти цитируемый пост)

, а еще и объявление вида:
Код

var
  var_name: type_name absolute another_var;

, то есть описание переменной, накладывающейся на другую переменную.

Спасибо за информацию, не знал об этом

Автор: merfol 22.12.2008, 21:05
спасибо, извините, что долго не отвечал, можно объяснить получше, как реализовать эту программу. Вот дан мне двумерный массив, что значит на него наложить одномерный массив?

Добавлено через 7 минут и 38 секунд
volvo877 можешь подробно описать свою процедуру , плиз, как она работает и что в ней передается 

Автор: Virtuals 23.12.2008, 07:26
merfol, 
вот примерчик демки
Код

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
Const
 MaxX=12;
 MaxY=15;

Type MsT= array[1..MaxY,1..MaxX] of integer;

procedure Xm(mms:MsT);
Var
     ML:array[1..MaxX*MaxY] of integer absolute mms;
     // обьявим переменную ML по абсолютному адресу переменной mms
     //что это дало, а то что получили линейный массив из двумерной матрици
     // а она могла быть и 3х мерной да вообще любой, нас главное интересует
     // точный размер переменной, в данном случае это MaxX*MaxY
     // иначе мы рискуем попасть на AV, вот поэтому и в некоторых источниках пишут что
     //не рекомендуется использование absolute, но присмотритесь какой мощьный механизм.
     //чего стоет только одно: как обьявление переменных разных типов по одному адресу

     Tmp1:integer;
begin
Writeln;
For Tmp1:=1 to MaxX*MaxY do
//цикл по всей матрице, у нас массив линейный, соответственно пофиг как там данные лежат :)
  begin
   Write(Ml[tmp1]:4);
   if tmp1 mod MaxX =0 then writeln;
  end;

end;

Var Ms:MsT;
    tmpX,tmpY:integer;
begin
  { TODO -oUser -cConsole Main : Insert code here }
for tmpy:=1 to MaxY do //цикл по оси Y
 for tmpx:=1 to MaxX do //цикл по оси X
                       Ms[tmpy,tmpx]:=tmpx+(tmpy-1)*MaxX;
  xm(ms); //передали массив в процедуру
readln;
end.


Автор: merfol 23.12.2008, 13:02
спасибо, Virtuals, стал понимать чуть чуть как с ним работать, вот написал программу, которая описана в самом начале, но она не хочет переставлять местами эти элементы(по заданию), хотя вроде всё правильно  smile Файл прикрепляю, к сообщению с кодом. Посмотрите, может кто найдет ошибку и скажет что не правильно. 

Автор: merfol 22.1.2009, 23:11
люди помогите  smile  еще чуть чуть осталось доработать программу  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)