Typy ciągów w Delphi (Delphi dla początkujących)

mężczyzna używający laptopa

Źródło obrazu RF/Cadalpe/Getty Images





Jak w przypadku każdego języka programowania, w Delfy , zmienne są symbolami zastępczymi używanymi do przechowywania wartości; mają nazwy i typy danych. Typ danych zmiennej określa, w jaki sposób bity reprezentujące te wartości są przechowywane w pamięci komputera.

Kiedy mamy zmienną, która będzie zawierać jakąś tablicę znaków, możemy zadeklarować ją jako typu Strunowy .
Delphi zapewnia zdrowy asortyment operatorów ciągów, funkcji i procedur. Przed przypisaniem typu danych String do zmiennej, musimy dokładnie zrozumieć cztery typy łańcuchów Delphi.



Krótki ciąg

Mówiąc prosto, Krótki ciąg to zliczona tablica znaków (ANSII) zawierająca maksymalnie 255 znaków w ciągu. Pierwszy bajt tej tablicy przechowuje długość ciągu. Ponieważ był to główny typ łańcucha w Delphi 1 (16-bitowe Delphi), jedynym powodem używania Short String jest kompatybilność wsteczna.
Do stworzenia zmiennej typu ShortString używamy:

|_+_|


The s zmienna to zmienna typu Short String zdolna do przechowywania do 256 znaków, jej pamięć to statycznie przydzielone 256 bajtów. Ponieważ jest to zwykle marnotrawstwo - mało prawdopodobne jest, aby twój krótki ciąg rozprzestrzenił się do maksymalnej długości - drugim podejściem do używania krótkich ciągów jest użycie podtypów ShortString, których maksymalna długość wynosi od 0 do 255.



|_+_|

Tworzy to zmienną o nazwie mały których maksymalna długość to 50 znaków.

Uwaga: Kiedy przypisujemy wartość do zmiennej Short String, ciąg jest obcinany, jeśli przekracza maksymalną długość dla typu. Kiedy przekazujemy krótkie ciągi do jakiejś procedury Delphi manipulującej ciągami, są one konwertowane na długie ciągi iz powrotem.

Ciąg / Długi / Ansi

Delphi 2 w Object Pascal Długi ciąg rodzaj. Długi łańcuch (w pomocy Delphi AnsiString) reprezentuje dynamicznie alokowany łańcuch, którego maksymalna długość jest ograniczona tylko dostępną pamięcią. Wszystkie 32-bitowe wersje Delphi domyślnie używają długich łańcuchów. Zalecam używanie długich sznurków, kiedy tylko możesz.

|_+_|

The s zmienna może zawierać od zera do dowolnej praktycznej liczby znaków. Ciąg rośnie lub kurczy się w miarę przypisywania do niego nowych danych.



Możemy użyć dowolnej zmiennej łańcuchowej jako tablicy znaków, drugiego znaku w s ma indeks 2. Poniższy kod

|_+_|

przypisuje T do drugiego znaku os s zmienny. Teraz kilka pierwszych postaci w s wygląda jak: TTe s str... .
Nie daj się zwieść, nie możesz użyć s[0], aby zobaczyć długość ciągu, s nie jest Krótkim Ciągiem.



Liczenie referencji, kopia przy zapisie

Ponieważ alokacja pamięci jest wykonywana przez Delphi, nie musimy się martwić o wyrzucanie śmieci. Podczas pracy z długimi ciągami (Ansi) Delphi używa zliczania referencji. W ten sposób kopiowanie ciągów jest w rzeczywistości szybsze w przypadku długich ciągów niż krótkich.
Liczenie referencji, na przykład:

|_+_|

Kiedy tworzymy string s1 zmiennej i przypisz do niej jakąś wartość, Delphi alokuje wystarczającą ilość pamięci dla łańcucha. Kiedy kopiujemy s1 do s2 , Delphi nie kopiuje wartości ciągu do pamięci, tylko zwiększa liczbę odwołań i zmienia s2 wskazywać na to samo miejsce w pamięci co s1 .



Aby zminimalizować kopiowanie, gdy przekazujemy ciągi do podprogramów, Delphi używa techniki kopiowania przy zapisie. Załóżmy, że mamy zmienić wartość s2 zmienna łańcuchowa; Delphi kopiuje pierwszy ciąg do nowej lokalizacji w pamięci, ponieważ zmiana powinna dotyczyć tylko s2, nie s1 i oba wskazują na tę samą lokalizację w pamięci.

Szeroki sznurek

Szerokie ciągi są również dynamicznie przydzielane i zarządzane, ale nie używają zliczania odwołań ani semantyki kopiowania przy zapisie. Szerokie ciągi składają się z 16-bitowych znaków Unicode.



O zestawach znaków Unicode

Zestaw znaków ANSI używany przez system Windows to zestaw znaków jednobajtowych. Unicode przechowuje każdy znak w zestawie znaków w 2 bajtach zamiast 1. Niektóre języki narodowe używają znaków ideograficznych, które wymagają więcej niż 256 znaków obsługiwanych przez ANSI. W notacji 16-bitowej możemy przedstawić 65 536 różnych znaków. Indeksowanie ciągów wielobajtowych nie jest wiarygodne, ponieważ si] reprezentuje i-ty bajt (niekoniecznie i-ty znak) w s .

Jeśli musisz użyć znaków Wide, powinieneś zadeklarować zmienną ciągu jako typu WideString i zmienną znakową typu WideChar. Jeśli chcesz sprawdzić szeroki ciąg znaków po jednym znaku, upewnij się, że testujesz znaki wielobitowe. Delphi nie obsługuje automatycznej konwersji typów między typami ciągów Ansi i Wide.

|_+_|

Zakończone zerem

Łańcuch zakończony zerem lub zerem jest tablicą znaków, indeksowaną liczbą całkowitą zaczynającą się od zera. Ponieważ tablica nie ma wskaźnika długości, Delphi używa znaku ASCII 0 (NULL; #0) do oznaczenia granicy ciągu.
Oznacza to, że zasadniczo nie ma różnicy między ciągiem zakończonym znakiem null a tablicą[0..NumberOfChars] typu Char, gdzie koniec ciągu jest oznaczony przez #0.

Używamy ciągów zakończonych znakiem NULL w Delphi podczas wywoływania funkcji Windows API. Object Pascal pozwala nam uniknąć bałaganu ze wskaźnikami do tablic liczonych od zera podczas obsługi łańcuchów zakończonych znakiem null przy użyciu typu PChar. Pomyśl o PChar jako wskaźniku do łańcucha zakończonego znakiem NUL lub do tablicy, która go reprezentuje. Aby uzyskać więcej informacji na temat wskaźników, sprawdź: Wskaźniki w Delphi .

Na przykład GetDriveType Funkcja API określa, czy dysk jest dyskiem wymiennym, stałym, CD-ROM, dyskiem RAM czy dyskiem sieciowym. Poniższa procedura zawiera listę wszystkich dysków i ich typów na komputerze użytkownika. Umieść jeden komponent Button i jeden Memo na formularzu i przypisz obsługę OnClick do przycisku:

|_+_|

Miksowanie strun Delphi

Możemy dowolnie miksować wszystkie cztery różne rodzaje strun, Delphi najlepiej nada sens temu, co próbujemy zrobić. Przypisanie s:=p, gdzie s jest zmienną łańcuchową, a p jest wyrażeniem PChar, kopiuje łańcuch zakończony znakiem null do długiego łańcucha.

Typy postaci

Oprócz czterech typów danych łańcuchowych, Delphi ma trzy typy znaków: Zwęglać , AnsiChar , i ​ WideChar . Stała łańcuchowa o długości 1, taka jak „T”, może oznaczać wartość znakową. Ogólnym typem znaku jest Char, który jest odpowiednikiem AnsiChar. Wartości WideChar to 16-bitowe znaki uporządkowane zgodnie z zestawem znaków Unicode. Pierwsze 256 znaków Unicode odpowiada znakom ANSI.