Pascal - pole jako parametr procedury

Datum vydání: 2012-11-24 12:11:26; aktualizováno: 2013-10-13 09:38:13

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 integerOpen 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í


Literatura