Delphi 6 ïðîãðàììèðîâàíèå

       

ÑÒÐÎÊÈ



7.3. ÑÒÐÎÊÈ

Äëÿ îáðàáîòêè òåêñòîâ â Object Pascal èñïîëüçóþòñÿ ñëåäóþùèå òèïû:

  • êîðîòêàÿ ñòðîêà shortString èëè string [n] , ãäå n <= 255;
  • äëèííàÿ ñòðîêà string;
  • øèðîêàÿ ñòðîêà WideString;
  • íóëü-òåðìèíàëüíàÿ ñòðîêà pchar.

Îáùèì äëÿ ýòèõ òèïîâ ÿâëÿåòñÿ òî, ÷òî êàæäàÿ ñòðîêà òðàêòóåòñÿ êàê îäíîìåðíûé ìàññèâ ñèìâîëîâ, êîëè÷åñòâî ñèìâîëîâ â êîòîðîì ìîæåò ìåíÿòüñÿ â ðàáîòàþùåé ïðîãðàììå: äëÿ string [n] äëèíà ñòðîêè ìåíÿåòñÿ îò 0 äî n, äëÿ string è pchar - îò 0 äî 2 Ãáàéò.

 ñòàíäàðòíîì Ïàñêàëå èñïîëüçóþòñÿ òîëüêî êîðîòêèå ñòðîêè String [n] .  ïàìÿòè òàêîé ñòðîêå âûäåëÿåòñÿ n+i áàéò, ïåðâûé áàéò ñîäåðæèò òåêóùóþ äëèíó ñòðîêè, à ñàìè ñèìâîëû ðàñïîëàãàþòñÿ íà÷èíàÿ ñî 2-ãî ïî ñ÷åòó áàéòà. Ïîñêîëüêó äëÿ äëèíû ñòðîêè â ýòîì ñëó÷àå îòâîäèòñÿ îäèí áàéò, ìàêñèìàëüíàÿ äëèíà êîðîòêîé ñòðîêè íå ìîæåò ïðåâûøàòü 255 ñèìâîëîâ. Äëÿ îáúÿâëåíèÿ êîðîòêîé ñòðîêè ìàêñèìàëüíîé äëèíû ïðåäíàçíà÷åí ñòàíäàðòíûé òèï ShortString (ýêâèâàëåíò String[255]).

 Windows øèðîêî èñïîëüçóþòñÿ íóëü-òåðìèíàëüíûå ñòðîêè, ïðåäñòàâëÿþùèå ñîáîé öåïî÷êè ñèìâîëîâ, îãðàíè÷åííûå ñèìâîëîì #î. Ìàêñèìàëüíàÿ äëèíà òàêîé ñòðîêè ëèìèòèðóåòñÿ òîëüêî äîñòóïíîé ïàìÿòüþ è ìîæåò áûòü î÷åíü áîëüøîé.

 32-ðàçðÿäíûõ âåðñèÿõ Delphi ââåäåí íîâûé òèï string, ñî÷åòàþùèé â ñåáå óäîáñòâà îáîèõ òèïîâ. Ïðè ðàáîòå ñ ýòèì òèïîì ïàìÿòü âûäåëÿåòñÿ ïî ìåðå íàäîáíîñòè (äèíàìè÷åñêè) è îãðàíè÷åíà èìåþùåéñÿ â ðàñïîðÿæåíèè ïðîãðàììû äîñòóïíîé ïàìÿòüþ. Çàìå÷ó, ÷òî â Delphi 1 òèï string ýêâèâàëåíòåí String [2 55], ò. å. îïðåäåëÿåò êîðîòêóþ ñòðîêó ìàêñèìàëüíî âîçìîæíîé äëèíû.

Äëÿ ñîâìåñòèìîñòè ñ êîìïîíåíòàìè, îñíîâûâàþùèìèñÿ íà OLE-òåõíîëîãèè, â Delphi 32 ââåäåíû òàêæå øèðîêèå ñòðîêè, îáúÿâëÿåìûå ñòàíäàðòíûì òèïîì wideString. Ïî ñâîèì ñâîéñòâàì îíè èäåíòè÷íû äëèííûì ñòðîêàì string, íî îòëè÷àþòñÿ îò íèõ òåì, ÷òî äëÿ ïðåäñòàâëåíèÿ êàæäîãî ñèìâîëà èñïîëüçóþòñÿ íå îäèí, à äâà áàéòà.



Ïðèìåðû îáúÿâëåíèé ñòðîêîâûõ òèïîâ:

var

ssS: String[250];// Êîðîòêàÿ ñòðîêà äëèíîé äî 250 ñèìâîëîâ

ssMax: ShortString;// Êîðîòêàÿ ñòðîêà äëèíîé äî 255 ñèìâîëîâ

stS : String; // Äëèííàÿ ñòðîêà

swS: WideString;// Øèðîêàÿ ñòðîêà

pcS: PChar; // Ññûëêà íà íóëü-òåðìèíàëüíóþ ñòðîêó

acS: array [0..1000] of Char; // Íóëü-òåðìèíàëüíàÿ ñòðîêà

// äëèíîé äî 1000 ñèìâîëîâ

Ïðè îáúÿâëåíèè ïåðåìåííîé sss êîìïèëÿòîð âûäåëèò äëÿ åå ðàçìåùåíèÿ 250 + 1 = 251 áàéò è ïîìåñòèò â ïåðâûé áàéò 0 - òåêóùóþ äëèíó ñòðîêè. Ïðè âûïîëíåíèè òàêîãî ôðàãìåíòà ïðîãðàììû:

procedure TfmExample.bbRunClick(Sender: TObject);

var

ssS: String[250];

begin

ssS :='Ñòðîêà ñèìâîëîâ';

ssS[6] := ' è'; // Ñèìâîëû â ñòðîêå íóìåðóþòñÿ, íà÷èíàÿ ñ 1

IbOutput.Caption := ssS; // Âûâîäèòñÿ “Ñòðîêè ñèìâîëîâ”

end;

ñíà÷àëà â ïåðåìåííóþ ssS áóäåò ïîìåùåíà öåïî÷êà ñèìâîëîâ ñòðîêà ñèìâîëîâ, ïðè÷åì 1-é áàéò ïîëó÷èò çíà÷åíèå 15 (êîëè÷åñòâî ñèìâîëîâ â ñòðîêå). Ïîñëå âûïîëíåíèÿ âòîðîãî îïåðàòîðà ñèìâîë ñ èíäåêñîì á (èíäåêñàöèÿ áàéòîâ íà÷èíàåòñÿ ñ 0, íî, ïîñêîëüêó ïåðâûé áàéò ñîäåðæèò òåêóùóþ äëèíó, ïåðâûé ñèìâîë â ñòðîêå èìååò èíäåêñ 1) áóäåò çàìåíåí íà “è”, è â ïåðåìåííîé îêàæåòñÿ öåïî÷êà ñòðîêè ñèìâîëîâ.

Ñîâåðøåííî äðóãèì áóäåò ìåõàíèçì ðàáîòû ñ ïàìÿòüþ ïðè îáúÿâëåíèè äëèííîé ñòðîêè sts: êîìïèëÿòîð âûäåëèò äëÿ ïåðåìåííîé 4 áàéòà, äîñòàòî÷íûå äëÿ ðàçìåùåíèÿ íîìåðà òîé ÿ÷åéêè ïàìÿòè, íà÷èíàÿ ñ êîòîðîé áóäåò ôàêòè÷åñêè ðàñïîëàãàòüñÿ ñèìâîëüíàÿ ñòðîêà. Ãîâîðÿò, ÷òî sts ññûëàåòñÿ íà ñòðîêó. Òàêîãî ðîäà ïåðåìåííûå-ññûëêè íàçûâàþòñÿ óêàçàòåëÿìè è îáñóæäàþòñÿ â ãë. 9. Ïðè âûïîëíåíèè ïåðâîãî îïåðàòîðà òàêîãî îáðàáîò÷èêà:

procedure TfmExample.bbRunClick(Sender: TObject);

var

stS, stSS: String;

begin

stS :='Ñòðîêà ñèìâîëîâ';

stSS := stS;

stS := 'Ýòî - '+stS;

stS[7] := ' c' ; // Ñèìâîëû â ñòðîêå íóìåðóþòñÿ, íà÷èíàÿ ñ 1

IbOutput.Caption := stS; //Âûâîäèòñÿ “Ýòî - ñòðîêà ñèìâîëîâ”

end;

ïðîãðàììà (à íå êîìïèëÿòîð!) îïðåäåëèò äëèíó öåïî÷êè ñèìâîëîâ Ñòðîêà ñèìâîëîâ, îáðàòèòñÿ ê ÿäðó ïåðàöèîííîé ñèñòåìû (ÎÑ) ñ òðåáîâàíèåì âûäåëèòü äëÿ íåå ó÷àñòîê ïàìÿòè äëèíîé 15+5=20 áàéò, ïîìåñòèò â ïåðåìåííóþ sts íîìåð ïåðâîãî âûäåëåííîãî áàéòà [ Íà ñàìîì äåëå â stS çàïîìèíàåòñÿ äåñêðèïòîð âûäåëåííîãî ó÷àñòêà ïàìÿòè, ñì. ãë. 9. ] è, íà÷èíàÿ ñ íåãî, ðàçìåñòèò â ýòîì ó÷àñòêå öåïî÷êó ñèìâîëîâ, çàâåðøèâ åå òåðìèíàëüíûì íóëåì è 4-áàéòíûì ñ÷åò÷èêîì ññûëîê. Òàêîå ðàçìåùåíèå íà ýòàïå ïðîãîíà ïðîãðàììû íàçûâàåòñÿ äèíàìè÷åñêèì, â òî âðåìÿ êàê ðàçìåùåíèå íà ýòàïå êîìïèëÿöèè - ñòàòè÷åñêèì. Ñ÷åò÷èê ññûëîê èãðàåò âàæíóþ ðîëü â ìåõàíèçìå ðàáîòû ñ ïàìÿòüþ. Ñ åãî ïîìîùüþ ðåàëèçóåòñÿ “êýøèðîâàíèå” ïàìÿòè: ïðè âûïîëíåíèè îïåðàòîðà

stSS := stS;

ïàìÿòü äëÿ ðàçìåùåíèÿ çíà÷åíèÿ ïåðåìåííîé stSS íå âûäåëÿåòñÿ, â ïåðåìåííóþ stSS ïîìåùàåòñÿ ñîäåðæèìîå óêàçàòåëÿ sts, à ñ÷åò÷èê ññûëîê â ñâÿçàííîé ñ íèì ïàìÿòè óâåëè÷èâàåòñÿ íà åäèíèöó. Òàêèì îáðàçîì, îáà óêàçàòåëÿ áóäóò ññûëàòüñÿ íà îäíó è òó æå îáëàñòü ïàìÿòè, ñ÷åò÷èê ññûëîê êîòîðîé áóäåò ñîäåðæàòü çíà÷åíèå 2. Ïðè âûïîëíåíèè îïåðàòîðà

stS := 'Ýòî - '+stS;

ñ÷åò÷èê ññûëîê óìåíüøàåòñÿ íà åäèíèöó, âûäåëÿåòñÿ íîâàÿ îáëàñòü ïàìÿòè äëèíîé 2 î + á = 2 á áàéò, óêàçàòåëü íà ýòó îáëàñòü ïîìåùàåòñÿ â stS, à â ñàìó ïàìÿòü ïåðåïèñûâàåòñÿ öåïî÷êà ñèìâîëîâ Ýòî -ñòðîêà ñèìâîëîâ, òåðìèíàëüíûé íîëü è ñîäåðæàùèé åäèíèöó ñ÷åò÷èê ññûëîê. Òåïåðü ïåðåìåííûå stS è stss áóäóò ññûëàòüñÿ íà ðàçíûå ó÷àñòêè ïàìÿòè, ñ÷åò÷èêè ññûëîê êîòîðûõ áóäóò ñîäåðæàòü ïî åäèíèöå. Âûäåëåííàÿ äëÿ ðàçìåùåíèÿ ñòðîêè String îáëàñòü ïàìÿòè îñâîáîæäàåòñÿ, åñëè åå ñ÷åò÷èê ññûëîê ñòàë ðàâåí íóëþ.

Ïîõîæèì îáðàçîì îñóùåñòâëÿåòñÿ ðàáîòà ñ ïàìÿòüþ ïðè îáúÿâëåíèè ïåðåìåííîé pcs òèïà pchar: êîìïèëÿòîð ñ÷èòàåò ýòó ïåðåìåííóþ óêàçàòåëåì è âûäåëèò äëÿ íåå 4 áàéòà:

procedure TfmExample.bbRunClick(Sender: TObject);

var

pcS: PChar;

begin

pcS :='Ñòðîêà ñèìâîëîâ';

pcS[5] := 'è'; {Ñèìâîëû â íóëü-ñòðîêå íóìåðóþòñÿ,íà÷èíàÿ ñ 0}

IbOutput.Caption := pcS; // Âûâîäèòñÿ “Ñòðîêè ñèìâîëîâ”

end;

Ïðîãðàììà ïîòðåáóåò îò ÎÑ 15 + 1 = 16 áàéò, ðàçìåñòèò â ïàìÿòè öåïî÷êó ñèìâîëîâ è çàâåðøàþùèé åå òåðìèíàëüíûé 0 è ïîìåñòèò àäðåñ âûäåëåííîãî ó÷àñòêà ïàìÿòè â pcs.

Ïðèìå÷àíèå
Ïðèìå÷àíèå

 ñòàíäàðòíîì ïàñêàëå, ïðè îáðàùåíèè ê îáëàñòè ïàìÿòè, íà êîòîðóþ ññûëàåòñÿ óêàçàòåëü , òðåáóåòñÿ çà èìåíåì óêàçàòåëÿ ñòàâèòü ñïåöèàëüíûé ñèìâîë .“^”.  Object Ðàsñà1 èíòåíñèâíî èñïîëüçóåòñÿ äèíàìè÷åñêàÿ, ïàìÿòü, è ïîýòîìó, ýòî æåñòêîå òðåáîâàíèå ñìÿã÷åíî: â áîëüøèíñòâå ñëó÷àåâ (è ïðè îáðàùåíèè ê òèïó pchar â òîì ÷èñëå) ñèìâîë "^" ñòàâèòü íå ñëåäóåò.

È, íàêîíåö, ïîñëåäíåå îáúÿâëåíèå acs êàê ìàññèâà ñèìâîëîâ.  Object Pascal ñ÷èòàåòñÿ ñîâìåñòèìûì ñ pchar îäíîìåðíûé ìàññèâ ñèìâîëîâ ñ íóëåâîé íèæíåé ãðàíèöåé.  îòëè÷èå îò pcs ïàìÿòü äëÿ òàêîé ïåðåìåííîé âûäåëÿåòñÿ ñòàòè÷åñêè (â íàøåì ïðèìåðå êîìïèëÿòîð âûäåëèò â ñåãìåíòå äàííûõ äëÿ ïåðåìåííîé acs 1001 áàéò).

Äëÿ ðàçìåùåíèÿ â acs íóëü-òåðìèíàëüíîé öåïî÷êè ñèìâîëîâ èñïîëüçóåòñÿ ïðîöåäóðà strcopy:

procedure' TfmExample.bbRunClick(Sender: TObject) ;

var

acS: array [0..1000] of Char;

begin

StrCopy(acS,'Ñòðîêà ñèìâîëîâ') ;

acS[5] := 'è'; { Ñèìâîëû â íóëü-ñòðîêå íóìåðóþòñÿ,íà÷èíàÿ ñ 0}

lbOutput.Caption := acS; // Âûâîäèòñÿ “Ñòðîêè ñèìâîëîâ”

end;

Íåîáõîäèìîñòü â íóëü-òåðìèíàëüíûõ ñòðîêàõ âîçíèêàåò òîëüêî ïðè ïðÿìîì îáðàùåíèè ê API-ôóíêöèÿì ÎÑ. Ïðè ðàáîòå ñ êîìïîíåíòàìè Delphi â îñíîâíîì èñïîëüçóþòñÿ áîëåå óäîáíûå äëèííûå ñòðîêè, êîòîðûå ðàññìàòðèâàþòñÿ â ï. 7.3.1.

È íåñêîëüêî ñëîâ î øèðîêèõ ñòðîêàõ, 32-ðàçðÿäíûå âåðñèè Windows èñïîëüçóþò òðè ñîðòà ñèìâîëîâ: îäíîáàéòíûé ñèìâîë ANSI, äâóõáàéòíûé ñèìâîë è ñèìâîë Unicode. Îäíîáàéòíûé ñèìâîë ñâÿçàí ñ îäíèì èç 256 âîçìîæíûõ çíà÷åíèé, êîòîðûå òðàêòóþòñÿ â çàâèñèìîñòè îò óñòàíîâëåííîé â Windows íàöèîíàëüíîé ñòðàíèöû (äëÿ ðàçìåùåíèÿ êèðèëëèöû èñïîëüçóåòñÿ ñòðàíèöà 1251). 256 ñèìâîëîâ âïîëíå äîñòàòî÷íû äëÿ îòîáðàæåíèÿ íàöèîíàëüíîãî àëôàâèòà ëþáîãî åâðîïåéñêîãî ÿçûêà. Äëÿ îòîáðàæåíèÿ àëôàâèòîâ íåêîòîðûõ àçèàòñêèõ ÿçûêîâ ýòîãî íåäîñòàòî÷íî.  ýòîì ñëó÷àå èñïîëüçóåòñÿ äâóõáàéòíûé ñèìâîë, â êîòîðîì ìëàäøèé áàéò îáû÷íî êîäèðóåòñÿ ñåìèáèòíûì ASCII-êîäîì, à ñòàðøèé óêàçûâàåò, êàê äîëæåí òðàêòîâàòüñÿ ýòîò êîä (êàêèì ñèìâîëîì îí áóäåò èçîáðàæàòüñÿ â äîêóìåíòå èëè íà ýêðàíå). Ñèìâîë Unicode â ïàìÿòè çàíèìàåò îäíî ñëîâî, êîòîðîå èìååò 65536 âîçìîæíûõ çíà÷åíèé. Ñïåöèàëüíàÿ ìåæäóíàðîäíàÿ êîìèññèÿ ïî Unicode âûðàáîòàëà ñîãëàøåíèå, ïîçâîëÿþùåå ñ ïîìîùüþ ýòîãî êîäà ïðåäñòàâèòü âñå ñèìâîëû âñåõ ÿçûêîâ ìèðà. Äâóõáàéòíûå ñèìâîëû è ñèìâîëû Unicode îáúÿâëÿþòñÿ ñòàíäàðòíûì òèïîì widecnar, à ñîñòàâëåííûå èç íèõ ñòðîêè - òèïîì widestring. Âñå Windows-ïðîãðàììû, èñïîëüçóþùèå OLE-òåõíîëîãèþ îáìåíà ñòðîêàìè, äîëæíû êîäèðîâàòü ñèìâîëû â ñîîòâåòñòâèè ñ Unicode.



Ñîäåðæàíèå ðàçäåëà