[TP] Niebanalne funkcje

0

Witam :]
Sprawa ma sie tak: musze przygotować referat o funkcjach w pascalu. Tak więc prosił bym o jakieś pomysły. :]

I jeszcze takie coś co właśnie mnie zaciekawiło tzn:
co oznacza takie coś:

var fun:function Bober(i:integer):string;

Dok: o co w tym chodzi i do czego taka zmienna może słuzyć [???]

0

I jeszcze takie coś co właśnie mnie zaciekawiło tzn:
co oznacza takie coś:

var fun:function Bober(i:integer):string;

Dok: o co w tym chodzi i do czego taka zmienna może słuzyć [???]

Nie wiem na 100%, ale wg mojej intuicji programistycznej, to ta zmienna będzie przechowywała wynik funkcji.

Czyli np. zrobisz:

bober(5);
write(fun);

Tak mi się wydaje. Sprawdź.</delphi>

0

Sorki ale coś mi sie powaliło z tym :/ bo widziałem to w Delphi (albo coś podobnego :d) a w pascalu chyba takiego czegoś nie ma...

0

var fun:function Bober(i:integer):string;

jest to zmienna typu function :P A tak na serio (poprzednie tez jest serio) to zazwyczaj uzywa sie czegos takiego po to aby wywolac jakas funkcje/procedure posiadajac jej adres (np z DLL - GetProcAddress)

A referat o funkcjach... deklarujesz i uzywasz :P Mozesz najwyzej przytoczyc np referencje, wstawki asm'a (tutaj np jaka zmienna do jakich rejestrow mozesz dac :P), calling conventions (tu delphi) czyli register,stdcal,safecall, rekurencje; wiele tego nie ma...

0

W Delphi wygląda to tak:

var
  fun : function (i:integer):string;

function Bober(i:integer):string;
begin
  result := '';
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  fun := Bober;
  ShowMessage(fun(1));
end;

Zastosowanie moze być np takie:

zamiast

if warunek then
  S := Funkcja1(1)
else
  S := Funkcja2(1);

piszemy:

if warunek then
  fun := Funkcja1
else
  fun := Funkcja2;
S := fun(1);

Wprawdzie na tym przykładzie nie widac praktycznej róznicy w działaniu obu kodów, ale np. jeżeli warunki sa sprawdzane kilka razy to 2 rozwiązanie moze znacznie przyspieszyć działanie programu.

0

Dzięki za odpowiedzi ale mam jeszcze takie jedno pytanko:

function Bober(i:integer):integer;forward;

Jak sie fachowo nazywa to "forward" ? :)

0

Może deklaracja zapowiadająca?

0

Tak mi się przypomniało, Szczelba, zobacz czy w TP jest function

HaWieSo:integer; overload;

czy zadziała overload to są rodzaje funkcji o tych samych nazwach, ale przyjmujące inneg argumenty (co do typu i ilość argumentów).

0

HaWieSo:integer; overload;

czy zadziała overload to są rodzaje funkcji o tych samych nazwach, ale przyjmujące inneg argumenty (co do typu i ilość argumentów).

yyy w TP chyba nie ma przeciążania funkcji..

0

yyy w TP chyba nie ma przeciążania funkcji..

Oczywiście, że nie ma, ale można zrobic metode obiektu jako wirtualną, aby mogły być np dwie takie same nazwy dla metod o różnym kodzie:

a: object
    procedure Create; virtual;
end;
b: object
    procedure Create(param: String); virtual;
end;

A to cytat z helpa:

Declaring a method as virtual makes it possible for methods with the same
name to be implemented in different ways within a hierarchy of object types.

0

a: object
procedure Create; virtual;
end;
b: object
procedure Create(param: string); virtual;
end;

A to cytat z helpa:

Declaring a method as virtual makes it possible for methods with the same
name to be implemented in different ways within a hierarchy of object types.

Owszem można, ale akurat to nie znajduje zastosowania w przykładzie, który podałeś - co wprowadza w błąd. Metoda wirtualna może być używana jak inna o tej samej nazwie w klasie macierzystej obiektu .. - tu masz dwa różne obiekty, wiec nie ma to sensu (brak hierarchii). A w ogóle to "Create" powinno być zarezerwowane dla konstruktora klasy .. nie zaleca się używanie takiej nazwy. Wiec nie wiem jaki miałeś cel w tym - może rozjaśnisz...

0

... A w ogóle to "Create" powinno być zarezerwowane dla konstruktora klasy .. nie zaleca się używanie takiej nazwy. Wiec nie wiem jaki miałeś cel w tym - może rozjaśnisz...

Sorry, dawno w pascalu nie pisałem :D
powinno to wyglądać tak, myśle już poprawnie i dokładnie :) :

Ma= ^Ta
Ta= object
    constructor Init; virtual;
end;

Mb= ^Tb
Tb= object
    a: Ma;
    constructor Init(param: string); virtual;
end;
0

No są to procki o tej samej nazwie ale nie tak to ma być, ponieważ przed nazwą procedury "Init" czeba podać nazwę tej klasy, a oto tu nie chodzi, zobacz sobie w Delphi procedurke WebBrowser.Navigate, ile ona ma tam możliwości i jak ona jest zrzobiona

0

dzięki ale temat już nie aktualny ;)
a co do tego przeciążania to wiem że w Delphi jest taka możliwośc :)
Pozdr.

1 użytkowników online, w tym zalogowanych: 0, gości: 1