10. Dynamické proměnné Dynamická proměnná se nezavádí deklarací proměnných, ale vzniká za běhu programu provedením speciálního příkazu. Nemá přidělen žádný identifikátor, odkazujeme se na ní pomocí speciálního typu - typu ukazatel. Hodnotou proměnné typu ukazatel je adresa umístění dynamické proměnné v paměti. Každý typ ukazatel je vázán na jeden typ dynamické proměnné. type spoj=^objekt; {spoj je ukazatel na proměnnou typu objekt} objekt=record hodnota:integer; dalsi:spoj; end; var p:spoj;
Objekt je typ definovaný pro vytvoření dynamické proměnné, která je typu záznamem. P - je ukazatel na dynamickou proměnnou typu objekt. Procedura new vytváří dynamickou proměnnou v oblasti operační paměti nazývané hromada - heap. Příkaz new(p) vytvoří dynamickou proměnnou typu object a ukazatel na ní uloží do proměnné p. Speciální hodnotou typu ukazatel je hodnota nil, která říká, že ukazatel nikam neukazuje. Po vytvoření má dynamická proměnná nedefinovanou hodnotu. Příklad práce s dynamickou proměnnou:· new(p); p^.hodn:=4; p^.dalsi:=nil
Možné přiřazení: p:=q... proměnné typu ukazatel může být přiřazena hodnota jiné proměnné typu ukazatel, obě budou ukazovat na stejnou dynamickou proměnnou, p^:=q^... hodnota dynamické proměnné, na kterou ukazuje proměnná q se překopíruje do dynamické proměnné, na kterou ukazuje proměnná p.
Proměnné téhož typu ukazatel mohou být použity jako operandy relačních operátorů =,<>; p=q je true, když obě proměnné ukazují na tutéž proměnnou. Operandem v těchto relacích může být také hodnota nil. Zrušení dynamické proměnné se provede příkazem dispose(p). Tímto příkazem se pouze uvolní část paměti zabraná dynamickou proměnnou, obsah proměnné p se nemění. Uvolněnou oblast paměti pak může použít jiná dynamická proměnná. Nevhodným vytvářením a rušením dynamických proměnných mohou v hromadě vzninout díry, což vede k neefektivnímu využití paměti. Př.: Příklad použití dynamické proměnné typu pole pevné velikosti.
program DynamickePole; type TPole=array[1..100] of real; TPole=array[1..100] of real;var i,j,n:integer; i,j,n:integer; a:^TPole; a:^TPole; p:real; p:real; f:text; f:text;begin writeln('Ukazka pouziti dynamicke promenne'); writeln('Ukazka pouziti dynamicke promenne'); writeln('*********************************'); writeln('*********************************'); writeln; writeln; assign(f,'data.txt');reset(f); assign(f,'data.txt');reset(f); new(a); new(a); read(f,n); read(f,n); writeln('Zadana posloupnost:'); writeln; writeln('Zadana posloupnost:'); writeln; for i:=1 to n do begin for i:=1 to n do begin read(f,a^[i]); read(f,a^[i]); write(a^[i]:8:2); write(a^[i]:8:2); end; end; writeln; writeln; writeln; writeln;
for i:=1 to n-1 do for i:=1 to n-1 do for j:=i+1 to n do for j:=i+1 to n do if a^[j]>a^[i] then begin if a^[j]>a^[i] then begin p:=a^[i]; a^[i]:=a^[j]; a^[j]:=p; p:=a^[i]; a^[i]:=a^[j]; a^[j]:=p; end; end; writeln('Setridena posloupnost:'); writeln; writeln('Setridena posloupnost:'); writeln; for i:=1 to n do for i:=1 to n do write(a^[i]:8:2); write(a^[i]:8:2); dispose(a); dispose(a); writeln; writeln; writeln; writeln; writeln('Konec - ENTER!'); writeln('Konec - ENTER!'); readln; readln;end.Př.: Příklad použití dynamické proměnné typu pole proměnné velikosti.
program DynamickePole2; type TPole=array[1..100] of real; TPole=array[1..100] of real;var i,j,n:integer; i,j,n:integer; a:^TPole; a:^TPole; p:real; p:real; f:text; f:text;begin writeln('Ukazka pouziti dynamicke promenne'); writeln('Ukazka pouziti dynamicke promenne'); writeln('*********************************'); writeln('*********************************'); writeln; writeln; assign(f,'data.txt');reset(f); assign(f,'data.txt');reset(f); read(f,n); read(f,n); GetMem(a,n*sizeof(real)); {n < 100 !!!!} GetMem(a,n*sizeof(real)); {n < 100 !!!!} writeln('Zadana posloupnost:'); writeln; writeln('Zadana posloupnost:'); writeln; for i:=1 to n do begin for i:=1 to n do begin read(f,a^[i]); read(f,a^[i]); write(a^[i]:8:2); write(a^[i]:8:2); end; end; writeln; writeln; writeln; writeln;
for i:=1 to n-1 do for j:=i+1 to n do for j:=i+1 to n do if a^[j]>a^[i] then begin if a^[j]>a^[i] then begin p:=a^[i]; a^[i]:=a^[j]; a^[j]:=p; p:=a^[i]; a^[i]:=a^[j]; a^[j]:=p; end; end; writeln('Setridena posloupnost:'); writeln; writeln('Setridena posloupnost:'); writeln; for i:=1 to n do for i:=1 to n do write(a^[i]:8:2); write(a^[i]:8:2); FreeMem(a); FreeMem(a); writeln; writeln; writeln; writeln; writeln('Konec - ENTER!'); writeln('Konec - ENTER!'); readln; readln;end.