[ Pobierz całość w formacie PDF ]
.Jest taka mo¿liwoœæ, gdy¿ macierz mo¿e byærozpatrywana jako wektor wektorów, które w przypadku tablicy dynamicznej (itablic wariantowych) nie musz¹ byæ identyczne.Poni¿szy przyk³ad przedstawiatworzenie trójk¹tnej macierzy ³añcuchów:varA : array of array of string;I, J : Integer;beginSetLength(A, 10);for I := Low(A) to High(A) dobeginSetLength(A[I], I);for J := Low(A[I]) to High(A[I]) doA[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';end;end;RekordyRekord — w przeciwieñstwie do tablicy — nie ma charakteru strukturyjednorodnej, lecz stanowi agregat potencjalnie ró¿nych typów.Odpowiednikiempascalowego rekordu s¹: struktura jêzyka C definiowana za pomoc¹ s³owakluczowego struct oraz typ definiowany (user-defined type) Visual Basica.Otoprzyk³ad rekordu w jêzyku Object Pascal oraz jego odpowiedniki w C i VisualBasicu:{ Pascal }TypeMyRec = Recordi : integer;d : doubleend;/* C */typedef struct {int i;double d;} MyRec;' Visual BasicType MyReci As Integerd As DoubleEnd TypeSk³adowe rekordu nazywane s¹ jego polami (fields), a odwo³ania do nich maj¹postaæ odwo³añ kwalifikowanych — po nazwie zmiennej nastêpuje kropkarozdzielaj¹ca i nazwa pola:varN : MyRec;beginN.i := 23;N.d := 3.4;end;Aby unikn¹æ ¿mudnego powtarzania nazwy zmiennej (w odwo³aniachkwalifikowanych), mo¿na u¿yæ tzw.instrukcji wi¹¿¹cej with, powoduj¹cej, ¿eodwo³ania do pól rekordu dotycz¹ konkretnej zmiennej.Oto poprzedni przyk³ad pozastosowaniu instrukcji wi¹¿¹cej:varN : MyRec;beginwith N dobegini := 23;d := 3.4;end;end;Rekord pascalowy mo¿e posiadaæ tzw.czêœæ zmienn¹, zwan¹ równie¿ czêœci¹wariantow¹ (uwaga: nie myliæ ze zmiennymi typu Variant!).Interpretacja czêœcizmiennej rekordu mo¿e odbywaæ siê na jeden ze zdefiniowanych z góry sposobów.Znawcy jêzyka C natychmiast rozpoznaj¹ w tym odpowiednik unii (union).Otoprzyk³ad rekordu z czêœci¹ zmienn¹ oraz jego odpowiednik w C++:TypeTVariantRecord = recordNullStrField : PChar;IntField : Integer;Case Integer of0 : (D: Double);1 : (I: Integer);2 : (C: Char);End;struct TUnionStruct{char * StrField;int IntField;union{double D;int I;char C;};};Zgodnie z powy¿sz¹ definicj¹, pola D, I oraz C zajmuj¹ ten sam obszar pamiêci.Czêœæ zmienna rekordu musi wyst¹piæ na jego koñcu.Nie ma przeciwwskazañ, by wczêœci zmiennej pojawi³o siê pole bêd¹ce rekordem zawieraj¹cym tak¿e czêœæzmienn¹.WskazówkaRegu³y Object Pascala zabraniaj¹ definiowania w zmiennej czêœci rekordu pólbêd¹cych zmiennymi o kontrolowanym czasie ¿ycia.ZbioryZbiory (sets) s¹ konstrukcj¹ unikatow¹, w³aœciw¹ jedynie Pascalowi (chocia¿C++Builder implementuje klasê-szablon Set emuluj¹c¹ zbiory pascalowe).Zbioryoferuj¹ wyj¹tkowo efektywny mechanizm reprezentowania kolekcji z³o¿onych zelementów typów porz¹dkowych, znakowych lub wyliczeniowych.Zbiory deklarujesiê za pomoc¹ klauzuli set of, na przyk³adtypeTCharSet = set of Char;definiuje zbiór znaków typu Char.Oto inny przyk³ad zbioru, zawieraj¹cego dni tygodnia:TypeTWeekDays = (Ni, Pn, Wt, Sr, Cz, Pt, So);// typ wyliczeniowyWeekDaysSet = set of TWeekDays;// zbiór oparty na typie wyliczeniowymI jeszcze jeden rodzaj deklaracji — deklaracje zbiorów opartych na typieokrojonym:DigitsSet = set of 0.9;Litery = 'A'.'z';Liczba elementów zbioru nie mo¿e przekraczaæ 256, natomiast numery porz¹dkowejego elementów (Ord()) nie mog¹ wykraczaæ poza przedzia³ 0 ¸ 255.Z tegowzglêdu poni¿sze deklaracje s¹ b³êdne:TShortIntSet = Set of ShortInt;// Ord(Low(ShortInt)) < 0TIntSet = set of Word;// wiêcej ni¿ 255 elementówTStringSet = set of String;// "String" nie jest typem porz¹dkowymKa¿dy kandydat na element zbioru reprezentowany jest przez pojedynczy bit:jedynka oznacza przynale¿noœæ do zbioru, zero — brak elementu w zbiorze.Rozmiar zmiennej zbiorowej zale¿ny jest wiêc od licznoœci (mocy) typu, na baziektórego zbiór zdefiniowano — nie przekracza on wiêc nigdy 32 bajtów
[ Pobierz całość w formacie PDF ]