Uvedu příklad, jak se může pole předávat jako parametr funkce či procedury, případně být jeho návratovou hodnotou funkce.
Pro tyto účely jsem vytvořila funkci pro načtení pole, proceduru pro výpis pole a dvě procedury či funkce pro kopii pole do pole. Procedury pro kopii pole nejsou nutné, protože Pascal sám umí zkopírovat celé pole do jiného pole pomocí prostého přiřazení. Podmínkou je, že pole musí být shodného typu (viz Pavel Satrapa1). Kopírování přiřazením do proměnné probíhá kopírováním hodnotou. Mně zde funkce či procedury pro kopírování pole poslouží jako jednoduchá ukázka možné manipulace s polem. Všechna předávaná pole musí být shodného typu. Nejlépe je, si pro tento účel založit extra typ pole, a to klíčovým slovem type.
Pole je možné předat buď hodnotou (dojde opravdu k jeho kopii), nebo odkazem pomocí klíčového slova var (nedojde ke kopii pole, pole se může ve funkci či proceduře změnit).
Fatal: Syntax error, "OF" expected but "[" found
Pascal nedovolí předat pole deklarované následujícím způsobem:
// ... procedure inicializace(var pole: array[MIN..MAX] of integer); // ...
či
// ... procedure p(pole: array[1..10] of integer); // ...
Je to z důvodu, že je vyžadována naprostá shoda typů a nestačí obsahově shodný typ (viz Pavel Satrapa1).
Zde uvádím možné řešení dané situace.
Free Pascal
program Pole; uses Crt; const MIN = 1; MAX = 8; type tPole = array[MIN..MAX] of integer; var a, b: tPole; procedure inicializace(var pole: tPole); var i: integer; begin for i := MIN to MAX do pole[i] := 0; end; procedure kopie1(a: tPole; var b: tPole); var i: integer; begin for i := MIN to MAX do b[i] := a[i]; end; function kopie2(a: tPole): tPole; var i: integer; b: tPole; begin for i := MIN to MAX do b[i] := a[i]; kopie2 := b; end; function nacti: tPole; var i, delka: integer; pole: tPole; begin inicializace(pole); write('Zadej delku pole (max. delka je ', MAX, '): '); read(delka); for i := MIN to delka do begin write('Zadej pole[', i, ']: '); readln(pole[i]); end; nacti := pole; end; procedure vypis(pole: tPole); var i: integer; begin for i := MIN to MAX do write('[', i, '] = ', pole[i], '; '); writeln; writeln; end; begin clrScr; inicializace(a); inicializace(b); a := nacti; writeln; writeln('Vypis pole a:'); vypis(a); inicializace(b); writeln('1. Zkopirovani pole pomoci prirazeni b := a; vypis pole b:'); b := a; vypis(b); inicializace(b); writeln('2. Zkopirovani pole pomoci procedury kopie1(a, b); vypis pole b:'); kopie1(a, b); vypis(b); inicializace(b); writeln('3. Zkopirovani pole pomoci funkce b := kopie2(a); vypis pole b:'); b := kopie2(a); vypis(b); repeat until keyPressed; end.
Spuštění programu
Zadej delku pole (max. delka je 8): 3 Zadej pole[1]: 4 Zadej pole[2]: 7 Zadej pole[3]: 1 Vypis pole a: [1] = 4; [2] = 7; [3] = 1; [4] = 0; [5] = 0; [6] = 0; [7] = 0; [8] = 0; 1. Zkopirovani pole pomoci prirazeni b := a; vypis pole b: [1] = 4; [2] = 7; [3] = 1; [4] = 0; [5] = 0; [6] = 0; [7] = 0; [8] = 0; 2. Zkopirovani pole pomoci procedury kopie1(a, b); vypis pole b: [1] = 4; [2] = 7; [3] = 1; [4] = 0; [5] = 0; [6] = 0; [7] = 0; [8] = 0; 3. Zkopirovani pole pomoci funkce b := kopie2(a); vypis pole b: [1] = 4; [2] = 7; [3] = 1; [4] = 0; [5] = 0; [6] = 0; [7] = 0; [8] = 0;
Poznámka. Předávání pole odkazem var
by bylo v některých případech vhodné i u parametrů, které neměníme a nejsou návratové, a to z důvodu úspory paměti a času (nedochází pak ke kopii pole pro účely procedury).
Otevřená pole
Dalším způsobem, jak uvedenou situaci řešit je použít např. array of integer
– Open array parameters. Otevřená pole navíc mohou být navíc předána jako konstatní parametry pomocí klíčového slova const
.
Více informací
- Free Pascal – online documentation – freepascal.org
- Pascal Language Reference guide – freepascal.org
- Open array parameters and array of const – Rudy's Delphi corner