Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Пара вопросов по Delphi   Найти похожие ветки 

 
Stalp ©   (2007-01-09 19:18) [0]

В институте задали ответить на вопросы. Все перерыл, нигде не могу найти нормальные ответы.
Вот вопросы:

1. Назначение библиотеки VCL.
2. Тип данных PChar и его преимущества над типом String.

Может кто-нибудь подскажет ответы? И если можно, пожалуйста, поподробнее.


 
Ega23 ©   (2007-01-09 19:24) [1]

2.

A PChar is a pointer to a null-terminated string of characters of the type Char. Each of the three character types also has a built-in pointer type:

A PChar is a pointer to a null-terminated string of 8-bit characters.
A PAnsiChar is a pointer to a null-terminated string of 8-bit characters.
A PWideChar is a pointer to a null-terminated string of 16-bit characters.

PChars are, with short strings, one of the original Object Pascal string types. They were created primarily as a C language and Windows API compatibility type.

A string represents a sequence of characters. Object Pascal supports the following predefined string types.

Type Maximum length Memory required Used for
ShortString 255 characters 2 to 256 bytes backward compatibility
AnsiString ~2^31 characters 4 bytes to 2GB 8-bit (ANSI) characters
WideString ~2^30 characters 4 bytes to 2GB Unicode characters;
COM servers and interfaces
AnsiString, sometimes called the long string, is the preferred type for most purposes.
String types can be mixed in assignments and expressions; the compiler automatically performs required conversions. But strings passed by reference to a function or procedure (as var and out parameters) must be of the appropriate type. Strings can be explicitly cast to a different string type (see Typecasts).
The reserved word string functions like a generic type identifier. For example,

var S: string;

creates a variable S that holds a string. In the default {$H+} state, the compiler interprets string (when it appears without a bracketed number after it) as AnsiString. Use the {$H–} directive to turn string into ShortString.
The standard function Length returns the number of characters in a string. The SetLength procedure adjusts the length of a string.
Comparison of strings is defined by the ordering of the characters in corresponding positions. Between strings of unequal length, each character in the longer string without a corresponding character in the shorter string takes on a greater-than value. For example, “AB” is greater than “A”; that is, "AB" > "A" returns True. Zero-length strings hold the lowest values.

You can index a string variable just as you would an array. If S is a string variable and i an integer expression, S[i] represents the ith character—or, strictly speaking, the ith byte—in S. For a ShortString or AnsiString, S[i] is of type AnsiChar; for a WideString, S[i] is of type WideChar. The statement MyString[2] := "A"; assigns the value A to the second character of MyString. The following code uses the standard UpCase function to convert MyString to uppercase.

var I: Integer;

begin
 I := Length(MyString);
 while I > 0 do
 begin
   MyString[I] := UpCase(MyString[I]);
   I := I - 1;
 end;
end;

Be careful indexing strings in this way, since overwriting the end of a string can cause access violations. Also, avoid passing long-string indexes as var parameters, because this results in inefficient code.
You can assign the value of a string constant—or any other expression that returns a string—to a variable. The length of the string changes dynamically when the assignment is made. Examples:

MyString := "Hello world!";

MyString := "Hello " + "world";
MyString := MyString + "!";
MyString := " ";               { space }
MyString := "";                { empty string }


 
Anatoly Podgoretsky ©   (2007-01-09 19:26) [2]

> Stalp  (09.01.2007 19:18:00)  [0]

В самом название все и зашифровано

1. Visual Component Library
2. Pointer Char - преимуществ нет, поскольку String совместим с PChar


 
kaZaNoVa ©   (2007-01-09 19:30) [3]

String лучше и удобнее в общем случае ..
а PChar обычно требуют разные АПИ-функции


 
Dmitrij_K   (2007-01-09 19:39) [4]

1. http://ru.wikipedia.org/wiki/VCL


 
ors_archangel ©   (2007-01-09 20:09) [5]


>  [D2, D3, D4, D5, D6, D7, D2005, 95/98, ME, NT4, 2000, XP, 2003]

И как же это у тебя всего столько установлено? А такие вещи спрашиваешь...


 
tesseract ©   (2007-01-09 23:31) [6]


> 2. Pointer Char - преимуществ нет, поскольку String совместим
> с PChar


> String лучше и удобнее в общем случае ..а PChar обычно требуют
> разные АПИ-функции


Pchar быстрее, ибо не являеться массивом хранящим размер свой, часто применяеться для перевода чёрт-знает чего в указатель :-).


 
Anatoly Podgoretsky ©   (2007-01-09 23:36) [7]

> tesseract  (09.01.2007 23:31:06)  [6]

> Pchar быстрее, ибо не являеться массивом хранящим размер свой

Именно поэтой причине он как раз более медленный и чем длиннее строка тем медленнее.
И видимо ты пропустил мимо ушей фразу, что String полностью совместим с PChar
Он имеет часть полностью совместимую с PChar + дополнительный блок для расширенной работы.


 
tesseract ©   (2007-01-10 00:09) [8]


> Он имеет часть полностью совместимую с PChar + дополнительный
> блок для расширенной работы.

Поэтому и медленнее при интесивной работе, где то в RSDN видел тесты работы. PCHAR - указатель, string - массив с соответсвующими накладными расходами на операции с блоком расширенной работы :-)


> String полностью совместим с PChar

из Справки TD, но справедливо для всех версий Delphi.

Long string to PChar conversions are not automatic. Some of the differences between strings and PChars can make conversions problematic:

Long strings are reference-counted, while PChars are not.
Assigning to a string copies the data, while a PChar is a pointer to memory.
Long strings are null-terminated and also contain the length of the string, while PChars are simply null-terminated.


ЗЫ: любой указатель в Delphi хранит свой размер, так что не совсем точно.


 
Anatoly Podgoretsky ©   (2007-01-10 00:22) [9]

> tesseract  (10.01.2007 00:09:08)  [8]

Никаких накладных расходов, просто указание компилятору считать указатель не на строку, а на array of char и нет никакой разницы, будешь работать как с естественным указателем.


 
koha ©   (2007-01-10 02:23) [10]

- Сочуствую бедному студенту.


 
ors_archangel ©   (2007-01-10 02:32) [11]


>  любой указатель в Delphi хранит свой размер, так что не
> совсем точно.

указатель хранит лишь адрес, вот если память под указатель выделена GetMem, тогда размер хранится в загловке блока:

function GetBlockSize(p: pointer): integer;
begin
 if p = nil then
   Result := -1
 else
   Result := Integer(Pointer((Integer(p) - 4))^) and $7FFFFFFC - 4;
end;


 
icWasya ©   (2007-01-10 09:52) [12]

Вот ещё про PChar
http://russian.joelonsoftware.com/Articles/BacktoBasics.html


 
tesseract ©   (2007-01-10 10:05) [13]


> указатель хранит лишь адрес, вот если память под указатель
> выделена GetMem, тогда размер хранится в загловке блока:
>


Я про это и говорю.



Страницы: 1 вся ветка

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.06 c
2-1168153668
vegarulez
2007-01-07 10:07
2007.01.28
Подскажите что-нибудь взамен функции Substr и Replacestr...


9-1142843534
Lambda
2006-03-20 11:32
2007.01.28
Файлы в GLMaterialLibrary из потока


11-1146387189
gugua
2006-04-30 12:53
2007.01.28
Движение курсором мыши над ListView в режиме VirtualListView


8-1149216168
h8394E
2006-06-02 06:42
2007.01.28
Библиотеки DirectX8 -> d3dx8ab.dll или d3dx8d.dll


15-1167834056
Miau
2007-01-03 17:20
2007.01.28
Проблема с флэшками