[ Pobierz całość w formacie PDF ]
.V[1] := 1;V[2] := 3;V[3] := 5;V[4] := 7;.Z kolei poni¿szy przyk³ad ilustruje tworzenie macierzy jednostkowej o wymiarze10´10, zawieraj¹cej elementy typu Double; na przek¹tnej macierzy wpisywane s¹jedynki, poza przek¹tn¹ — zera:// © A.Gra¿yñskiConstVDim = 10;VarV: Variant;i, j : IntegerbeginV := VarArrayCreate( [1 , VDim, 1, VDim], varDouble );For i := 1 to VDim dobeginFor j := 1 to VDim dobeginV[i, j] := (I div J) * (J div I); // 1, gdy i=j, 0 gdy ijend;end;end;Oczywiœcie nic nie stoi na przeszkodzie, aby elementy tablicy same by³yzmiennymi wariantowymi, w szczególnoœci — zawiera³y wskazanie na tablicewariantowe! Umo¿liwia to tworzenie tablic wy¿szego rzêdu, posiadaj¹cych ciekaw¹cechê nieortogonalnoœci.Tablicê nazywamy ortogonaln¹, jeœli da siê onaprzedstawiæ jako wektor zmiennych jednakowego typu — i tak, np.tablica array[ 1.10 ] of real jest 10-elementowym wektorem zmiennych typu real, macierzarray [ 1 . 5, 2 . 20 ] of integer mo¿e byæ rozpatrywana b¹dŸ jako5-elementowy wektor tablic array [ 2.20 ] of integer, b¹dŸ 19-elementowywektor tablic array [ 1.5 ] or integer.Ogólnie rzecz bior¹c, ka¿da „zwyk³a”tablica pascalowa jest tablic¹ ortogonaln¹, lecz tablice wariantowe wcale niemusz¹ posiadaæ tej cechy.Oto prosty przyk³ad — poni¿sza sekwencja tworzytrójk¹tn¹ tablicê stanowi¹c¹ „górny” trójk¹t macierzy 10´10 elementów typuDouble:// © A.Gra¿yñskivarV : Variant;i : integer;constVDim = 10;beginV := VarArrayCreate ( [1 , VDim], varVariant);for i := 1 to VDim dobeginV[i] := VarArrayCreate ( [1 , VDim-i+1], varDouble);end;…Funkcja VarArrayOf()Funkcja VarArrayOf() deklarowana jest w module System nastêpuj¹co:Function VarArrayOf(const Values: array of Variant): Variant;i — jak ³atwo siê domyœliæ — s³u¿y do zgrupowania w jednowymiarow¹ tablicêwariantow¹ wartoœci stanowi¹cych kolejne elementy wektora podanego jakoparametr.Po wykonaniu poni¿szej instrukcjiV := VarArrayOf( [ 1, 'Delphi', 2.2] );V[1] zawiera liczbê ca³kowit¹ 1, V[2] zawiera ³añcuch 'Delphi', natomiast V[3]jest liczb¹ rzeczywist¹ o wartoœci 2.2.Tablica utworzona w ten sposób mo¿ewiêc byæ tablic¹ heterogeniczn¹, tj.posiadaj¹c¹ elementy ró¿nych typów.Procedury i funkcje wspomagaj¹ce zarz¹dzanie tablicami wariantowymiOprócz opisanych funkcji VarArrayCreate() i VarArrayOf() Object Pascal oferujekilka równie u¿ytecznych podprogramów zwi¹zanych z tablicami wariantowymi.Zdefiniowane s¹ one w module System — oto ich nag³Ã³wki, nastêpnie krótkiopis:function VarIsArray (const A: Variant): Boolean;function VarArrayDimCount (const A: Variant): Integer;function VarArrayLowBound (const A: Variant; Dim: Integer): Integer;function VarArrayHighBound (const A: Variant; Dim: Integer): Integer;procedure VarArrayRedim (var A : Variant; HighBound: Integer);function VarArrayRef (const A: Variant): Variant;function VarArrayLock (const A: Variant): Pointer;procedure VarArrayUnlock (const A: Variant);Funkcja VarIsArray() dokonuje prostego sprawdzenia, czy przekazany parametrjest tablic¹ wariantow¹:function VarIsArray(const A: Variant): Boolean;beginResult := TVarData(A).VType and varArray 0;end;Funkcja VarArrayDimCount() zwraca liczbê wymiarów tablicy, natomiast doln¹ orazgórn¹ granicê ka¿dego wymiaru poznaæ mo¿na dziêki funkcjom VarArrayLowBound() iVarArrayHighBound().Procedura VarArrayRedim() umo¿liwia zmianê górnej granicy najwy¿szego whierarchii wymiaru tablicy — to ten wymiar, który identyfikowany jest przezostatni (skrajny, prawy) indeks.Istniej¹ce elementy tablicy zostaj¹ zachowane,ewentualne nowe elementy otrzymuj¹ wartoœci o reprezentacji zerowej.Funkcja VarArrayRef() otrzymuj¹c tablicê wariantow¹, tworzy zmienn¹ wariantow¹zawieraj¹c¹ wskazanie na tê tablicê.Ta dziwna na pozór czynnoœæ podyktowanazosta³a potrzebami wynikaj¹cymi z u¿ytkowania serwerów automatyzacji OLE, którewymagaj¹ tablicy wariantowej w takiej w³aœnie postaci.function VarArrayRef(const A: Variant): Variant;beginif TVarData(A).VType and varArray = 0thenError(reVarNotArray);_VarClear(Result);TVarData(Result).VType := TVarData(A).VType or varByRef;if TVarData(A).VType and varByRef 0thenTVarData(Result).VPointer := TVarData(A).VPointerelseTVarData(Result).VPointer := @TVarData(A).VArray;end;Je¿eli wiêc, na przyk³ad, VA oznacza tablicê wariantow¹, to wywo³anie dowolnejfunkcji API zwi¹zanej z serwerem powinno mieæ postaæServer.PassvariantArray(VarArrayRef(VA));Istnienie funkcji VarArrayLock() i VarArrayUnlock() podyktowane jest pewnymsubtelnym aspektem efektywnoœciowym, który postaramy siê zilustrowaæ na prostymprzyk³adzie.Za³Ã³¿my, i¿ chcemy skopiowaæ zawartoœæ wektora bajtów sk³adaj¹cegosiê z 10000 elementów do nowo utworzonej tablicy wariantowej, na przyk³ad w takoczywisty sposób:varV: Variant;A: Array [ 1.10000] of byte;.V := VarArrayCreate([1, 10000], VarByte);for i := 1 to 10000 doV[i] := A[i];Nastêpuje tutaj wykonanie kolejno 10000 przypisañ, z których ka¿de jest doœækosztowne, wymaga bowiem wykonania dosyæ skomplikowanych kontroli i obliczeñ,wynikaj¹cych m.in
[ Pobierz całość w formacie PDF ]
Linki
- Strona startowa
- Brian Lumley [Titus Crow 04] Spawn of the Winds (epub)
- Ludlum Robert Tajne Archiwa 04 Kod Altmana
- Cassandra Clare 04 Miasto Upadlych Aniolow
- Antologia SF Spotkanie w przestworzach 04 id
- Butcher, Jim Dresden 04 Rycerz Krolowej
- Brooks Terry 04 Kabalowa szkatula
- Becca Fitzpatrick 04 Finale
- Bleibtreu, Karl Bismarck 04
- Barton Beverly Kazdy jej krok
- Ellroy James Krew to wloczega (CzP)
- zanotowane.pl
- doc.pisz.pl
- pdf.pisz.pl
- spraypainting.htw.pl