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

 
 Ответить  Открыть новую тему 
> Процедурные типы
Bokul
сообщение 25.12.2006 9:47
Сообщение #1


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Модуль должен обеспечивать реализацию четырех-вершиной выпуклой фигуры, обладая теми же возможностями, что и объект TRect, описанный в модуле objects.

{$mode objfpc}
unit u7;
interface
type
    TMyPoint=record
      x,y:double;
    end;

    TLine=record// хранит коэффициенты прямой типа y=k*x+c
      k,c:double;
    end;

    TApexes=record// хранит вершины фигуры
       a1,a2,a3,a4:TMyPoint;
    end;

    TPFourPoints=^TFourPoints;
    TFourPoints=object
       Points:TApexes;
       constructor assign(a1,a2,a3,a4:TMyPoint);//инициализируем Points
       function    contains(p:TMyPoint):boolean;// провеяем входит ли точка в объект
    end;

implementation
type
    ProcPosition=Function(line:TLine; point:TMyPoint):boolean;

function Above(line:TLine; point:TMyPoint):boolean; far;//проверяем правда что точка point выше прямой line
begin
  Above:=(point.x*line.k+line.c)>point.y;
end;

function Below(line:TLine; point:TMyPoint):boolean; far;//проверяем правда что точка point ниже прямой line
begin
  Below:=(point.x*line.k+line.c)<=point.y;
end;

function FindLine(p1,p2:TMyPoint):TLine;//находим коэффициенты прямой по двоим точкам
var line:TLine;
begin
  line.k:=(p2.x-p1.x)/(p2.y-p1.y);
  line.c:=p1.y-line.k*p1.x;
  FindLine:=line;
end;

function PosRelToLine(line:TLine; point:TMyPoint; pos:ProcPosition):boolean;// совмещаем Above и Below
begin
  PosRelToLine:=pos(line,point);
end;

constructor TFourPoints.assign(a1,a2,a3,a4:TMyPoint);//инициализируем Points
begin
  Points.a1:=a1;
  Points.a2:=a2;
  Points.a3:=a3;
  Points.a4:=a4
end;

function TFourPoints.contains(p:TMyPoint):boolean;// провеяем входит ли точка в объект
begin
  with Points do
       begin
            if (PosRelToLine(FindLine(a1,a2),p,below)) and //!!!Ошибка!!! Error: Wrong number of parameters specified
               (PosRelToLine(FindLine(a2,a3),p,above)) and
               (PosRelToLine(FindLine(a3,a4),p,above)) and
               (PosRelToLine(FindLine(a4,a1),p,below)) then
               contains:=true
            else
                contains:=false;
       end;
end;
end.


Я ж не должен там ставить параметры, что ему не нравится?






--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.12.2006 11:06
Сообщение #2


Гость






            if (PosRelToLine(FindLine(a1,a2),p,@below)) and
               (PosRelToLine(FindLine(a2,a3),p,@above)) and
               (PosRelToLine(FindLine(a3,a4),p,@above)) and
               (PosRelToLine(FindLine(a4,a1),p,@below)) then
               contains:=true
Welcome to FPC smile.gif
 К началу страницы 
+ Ответить 
Bokul
сообщение 25.12.2006 17:47
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Welcome to FPC

yes2.gif
Спасибо!
А как их можно сравнивать, ведь теперь запись @below означает выполнить below, а не взять адрес below?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.12.2006 17:58
Сообщение #4


Гость






Цитата
А как их можно сравнивать
Кого "их"? Указатели на функции? Или сами функции?
 К началу страницы 
+ Ответить 
Bokul
сообщение 25.12.2006 18:02
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Сами функции..


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.12.2006 18:38
Сообщение #6


Гость






А что, в TP ты мог их сравнивать? Зачем ???
 К началу страницы 
+ Ответить 
Bokul
сообщение 25.12.2006 18:45
Сообщение #7


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Цитата
А что, в TP ты мог их сравнивать?

Сам же писал Процедурные типы :
Цитата

К сожалению есть неопределённость для компилятора, например в таком случае:


Type
  Func = Function: Real;
Var F: Func;
 
Function FFF: Real;
Begin
  FFF:= 1.25;
End;
 
Function FF: Real;
Begin
  FF:= 2.10;
End;
...
F:= FF;
If F = FFF then ...



В подобных случаях неочевидно, должен ли компилятор сравнивать значение процедуры F с FFF или нужно вызвать процедуру F и FFF и сравнить их значения. Принято, что такое вхождение идентификатора подпрограммы означает вызов функции.

Чтобы сравнить значение переменной F со значением (адресом) подпрограммы FFF нужно использовать следующую конструкцию:

If @F = @FFF then ...

Чтобы получить адрес самой процедурной переменной нужно написать:

@@F



Цитата
Зачем ???

Не знаю, с такой необходимостью еще не встречался. Но все-равно интересно.. smile.gif


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.12.2006 18:57
Сообщение #8


Гость






Цитата
Сам же писал
А, простите, у тебя где-то была описана переменная процедурного типа? Ты ж просто передаешь функцию как параметр!

С переменными - вот так:
{$mode ObjFPC}

type
  T = procedure;

procedure a;
begin
  writeln('a');
end;

procedure b;
begin
  writeln('b');
end;

procedure to_do(p: T);
begin
  p;
end;

var
  var_1, var_2, var_3: T;
begin
  var_1 := @a;
  var_2 := @b;
  var_3 := @a;

  to_do(@a);

  writeln('var_1 vs. var_2');
  if var_1 = var_2 then writeln('equal')
  else writeln('non-equal');

  writeln('var_1 vs. var_3');
  if var_1 = var_3 then writeln('equal')
  else writeln('non-equal');

end.
Кстати, Far совершенно не обязателен в FPC - он и так все подпрограммы делает с расчетом на дальний вызов...
 К началу страницы 
+ Ответить 
Bokul
сообщение 25.12.2006 19:33
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


То есть в Fpc получается наоборот: @-для выполнения процедуры и просто переменная процедурного типа - для взятия ее значения?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

- Текстовая версия 10.08.2025 3:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"