do ÂściÂągnięcia > pobieranie > ebook > pdf > download

[ Pobierz całość w formacie PDF ]
.St¹d prosty wniosek, ¿e repertuarznaków reprezentowalnych w ³añcuchach omawianego typu jest zubo¿ony o znak okodzie zero.W poprzednich wersjach Pascala, do Delphi 1 w³¹cznie, znak reprezentowany by³przez jeden bajt pamiêci, st¹d te¿ istnia³ jedynie jeden typ ³añcuchów zzerowym ogranicz­nikiem — typ PChar.Typ ten istnieje nadal w nastêpnychwersjach Delphi, ze wzglê­dów kompatybilnoœci oraz na potrzeby interfejsu Win32API.Ze wzglêdu jednak¿e na trzy typy znaków (Char, WideChar i AnsiChar) wwprowadzono w Delphi 2 dodat­kowe typy omawianych ³añcuchów: PWideChar iPAnsiChar.Jak ³atwo wywnioskowaæ z powy¿szego opisu, ³añcuch z zerowym ogranicznikiemrepre­zentowany jest przez wskaŸnik do pierwszego znaku (rysunek 2.3), awymienione trzy typy PChar, PWideChar i PAnsiChar s¹ wed³ug terminologii jêzykaPascal typami wskaŸni­kowymi (pointers).Rysunek 2.3.Napis „DDG” reprezentowany w postaci ³añcucha z zerowymogranicznikiemW odró¿nieniu od ³añcuchów typu AnsiString, opisywanym tu ³añcuchom nietowarzyszy ¿aden mechanizm wspomagaj¹cy zarz¹dzanie pamiêci¹ operacyjn¹ — jejprzydzielanie i zwal­nianie odbywa siê w sposób jawny.Podstawow¹ funkcj¹dokonuj¹c¹ przydzia³u pamiêci dla ³añcuchów z zerowym ogranicznikiem jestfunkcja StrAlloc(), mo¿liwe jest jednak wykorzystanie w tym celu tak¿epodstawowych funkcji Object Pascala, w rodzaju AllocMem(), GetMem(), StrNew() ,a nawet VirtualAlloc().Nale¿y jednak zaznaczyæ, ¿e sposób zwalnianiaprzydzielonej pamiêci musi byæ zgodny ze sposobem jej przydzielania; wzajemn¹odpowiednioœæ niektórych funkcji w tym wzglêdzie przedstawia tabela 2.7.Tabela 2.7.Funkcje przydzia³u i zwalniania pamiêci operacyjnej na potrzeby³añcuchów z zerowym ogranicznikiemFunkcja przydzielaj¹caFunkcja zwalniaj¹caAllocMem()FreeMem()GlobalAlloc()GlobalFree()GetMem()FreeMem()New()Dispose()StrAlloc()StrDispose()StrNew()StrDispose()VirtualAlloc()VirtualFree()Choæ naruszenie regu³ powy¿szej tabeli nie zawsze jest b³êdem (doœwiadczonyprogramista wie przecie¿, ¿e np.StrAlloc() oraz StrNew() korzystaj¹ zprocedury GetMem()), to jednak ich przestrzeganie zmniejsza ryzyko pope³nieniab³êdu.Poni¿szy przyk³ad ilustruje wykorzystanie ³añcuchów z zerowym ogranicznikiem.VarP1, P2 : PChar;S1, S2 : AnsiString;beginP1 := StrAlloc(64 * Sizeof(Char));{ P1 wskazuje na 63 znakowy ³añcuch }StrPCopy (P1, 'Delphi 6 ');{ Do ³añcucha P1 zostaje wpisana konkretna zawartoœæ }S1 := 'vademecum profesjonalisty';{ Do ³añcucha S1 zostaje wpisana konkretna zawartoœæ }P2 := StrNew(PChar(S1));{ P2 wskazuje na kopiê S1 }StrCat(P1, P2);{ konkatenacja P1 i P2 }S2 := P1{ S2 zawiera napis 'Delphi 6 vademecum profesjonalisty' }StrDispose(P1);StrDispose(P2);{ zwolnienie przydzielonej pamiêci}end.Zwróæ uwagê, ¿e rozmiar przydzielanej pamiêci zostaje obliczony za pomoc¹konstruk­cji SizeOf(Char) — jest to prost¹ konsekwencj¹ faktu, ¿e znak typuChar byæ mo¿e nie bêdzie ju¿ jednobajtowy w nastêpnych wersjach Delphi.Funkcja StrCat() wykonuje konkatenacjê dwóch ³añcuchów typu PChar — nie mo¿naw tym celu wykorzystaæ operatora +, jak to mia³o miejsce w przypadku ³añcuchówAnsiString, WideString i ShortString.Funkcja StrNew() tworzy kopiê ³añcucha podanego jako parametr.Poniewa¿ funkcjeoperuj¹ce na ³añcuchach z zerowym ogranicznikiem nie posiadaj¹ ¿adnejinformacji o wielkoœci pamiêci przydzielanej na ich potrzeby, odpowiedzialnoœæza przydzielenie wystarczaj¹co du¿ego obszaru spoczywa ca³kowicie naprogramiœcie.Najczêstszym b³êdem jest przydzielanie zbyt ma³ego obszaru — wponi¿szym przyk³adzie funkcja StrCat() usi³uje przypisaæ 13-znakowy napis„Witaj œwiecie” do ³añcucha zdolnego pomieœciæ napis co najwy¿ej 6-znakowy:varP1, P2 : PChar;beginP1 := StrNew('Witaj ');P2 := StrNew('œwiecie!');StrCat (P1, P2 ); // tu nastêpuje wyjœcie poza przydzielon¹ pamiêæ [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • klimatyzatory.htw.pl