Opcjonalne parametry

0

Jak zrobić, żeby do funkcji/procedury można było podać różną ilość parametrów, to znaczy żeby zdefiniować kilka parametrów opcjonlanych. Takie coś jest w funkcji Concat, Inc, Dec... .

Proszę o szybką pomoc i z góry dziękuję!

0

Parametry domyślne....

<font color="blue">procedure NowaGra(ImieGracza : String; NumerGracza : Integer = 1);</span>

W tym przypadku nie trzeba podawać numeru gracza, jeśli się tak zrobi - będzie wartość ta równa 1.

0

W sumie może to wystarczy, ale to nie są parametry opcjonalne.
No cóż jak mi się to nie spodoba to przylecę DETOX do ciebie z płaczem. ;-)

DZIĘKI!

0

Możesz też zrobić tak:

procedure NowaGra(ImieGracza : String; NumerGracza : Integer); overload;

procedure NowaGra(ImieGracza : String; overload;

procedure NowaGra(NumerGracza : Integer); overload; 

procedure NowaGra(NumerGracza : Integer; CosTamJeszcze: Typ); overload;

itd... :)

0

to nie są parametry opcjonalne.

A co to jest, jak nie parametry opcjonalne???

0

Odpada! Co to za paskudztwo?
Musi być jakiś elegancki sposób! Pisze o tym w pomocy, ale "moja angielski być słabe". Pod hasłem Parameters, opisuje optional parameters.

pq: fachowo to jest to Default Value, a to nie jest Optional Value.

0

http://4programmers.net/view.html?id=221 <- parametry domyślne
http://4programmers.net/view.html?id=150 <- przeciążanie funkcji

Funkcji takich jak w printf czy scanf z C nie można stworzyć, ze względu na sposób przekazywania parametrów przez stos w Delphi od lewej do prawej.
Jeżeli jednak zależy nam na przekazaniu stałych do procedury o dowolnej liczbie parametrów (i typów) tak jak np. w windowsowej funkcji wsprintf to możemy skorzystać z tablic stałych:

  procedure Test(A: array of const);
  begin
    ShowMessage(A[0].VChar+IntToStr(A[2].VInteger));
    A[1].VInteger := 2;
  end;

var
  q: Integer;
begin
  q := 0;
  Test(['a', q, 3]);
  ShowMessage(IntToStr(q)); //q dalej 0
end;

Oczywiście odczytując w procedurze Test musimy wiedzieć ile jest parametrów w tablicy i jakiego typu.

Przekazywanie zmiennych nie jest możliwe. Możemy jednak skorzystać ze wskaźników i otrzymać z powrotem wartości w zmiennych:

  procedure Test(A: array of const);
  begin
    ShowMessage(A[0].VChar+IntToStr(A[2].VInteger));
    Integer(A[1].VPointer^) := 2;
  end;

var
  q: Integer;
begin
  q := 0;
  Test(['a', @q, 3]);
  ShowMessage(IntToStr(q)); //teraz q = 2
end;
0

Przepraszam. Jak to się nie da? Ale ja podałem przykład już 3 takich funkcji! I działają! A jedna to ma nawet nieskończoną ilość parametrów (Concat) Więc jakto się nie da???????

0

Wszystkie te funkcje są umieszczone w module System, który jest integralną częścią kompilatora. Ty ich napisać nie możesz.

0

No i znów wychodzi największa bolączka Pascala - moduł System którego za cholerę się nie wywali (i nie zrobi podobnego nawet za dwie cholery)... Właśnie dla tego piszę pseudopascalowy kompilator pozbawiony tej wady :). Od razu uspokoję osoby przerażone słowami "piszę kompilator" - ja wiem, jak się za to zabrać, nie będę zadawać durnych pytań.

0

Właśnie dla tego piszę pseudopascalowy kompilator pozbawiony tej wady :).

Ale wiesz, że będziesz musiał rozszerzyć gramatykę pascala m. in. o właśnie te parametry opcjonalne?
To nie był przypadek, że takie właśnie funkcje umieszczono wewnątrz kompilatora:

  1. Nie wpływa znacznie na analizę składniową.
  2. Parametry opcjonalne wyłączają sprawdzanie typów (tak jak to jest w C), przez co istnieje możliwość przekazania parametrów o złych typach do procedury, a znalezienie takiego błędu jest dosyć trudne. Znając właściwości pascala, jako języka silnie typowanego, nie można było sobie pozwolić na takie łamanie zasad... łamie je tylko kompilator, który jednak sprawdza te typy (choć zapewne inaczej, niż pozostałe określone w specyfikacji).

A tak w ogóle to powodzenia dla kolegi po fachu (ja też pisze... a raczej próbuję).

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