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

Вниз

А что представляет из себя переменная типа string   Найти похожие ветки 

 
Pavel__   (2005-09-09 21:38) [0]

...после объявления в var? И будет ли отличие при двух нижеследующих примерах:


// 1

var
 S: string;
begin
 S := "";
 ...
end;

// 2
var
 S: string;
begin
 ...
end;


Заранее извиняюсь, если спросил глупость. С уважением.


 
vrem   (2005-09-09 21:45) [1]

Если статический массив, то после объявления в нём часто мусор, обнулять приходится, а string тоже массив, может тоже мусор..
будет больше отличия если
var s:string[30] <---- памяти меньше, чем просто string


 
MBo ©   (2005-09-09 21:45) [2]

Собственно говоря, ты ничего и не спросил...


 
begin...end ©   (2005-09-09 21:49) [3]


> vrem   (09.09.05 21:45) [1]

> будет больше отличия если
> var s:string[30] <---- памяти меньше, чем просто string

Почему меньше?


 
Pavel__   (2005-09-09 21:50) [4]

2 MBo

грубо говоря я об этом "Если статический массив, то после объявления в нём часто мусор, обнулять приходится, а string тоже массив, может тоже мусор.."

Слышал звон..


 
iXT   (2005-09-09 21:57) [5]

Дкльфа умная: после объявления ="" (Length(str)=0). И массив не статический!


 
DesWind ©   (2005-09-09 22:01) [6]

Из-за этого вопроса я на экзамене схлопотал сетверку.... Указатель.


 
DesWind ©   (2005-09-09 22:06) [7]

iXT   (09.09.05 21:57) [5]

а отличия, нет.


 
iXT   (2005-09-09 22:49) [8]

DesWind ©   (09.09.05 22:06) [7]

В чем?


 
DesWind ©   (2005-09-09 22:53) [9]

Я и привел как цитату.


 
Eraser ©   (2005-09-09 22:55) [10]

DesWind ©   (09.09.05 22:01) [6]
Указатель.


Не совсем...


 
DesWind ©   (2005-09-09 23:02) [11]

Eraser ©   (09.09.05 22:55) [10]

А что?


 
iXT   (2005-09-09 23:04) [12]

Eraser ©   (09.09.05 22:55) [10]

Но и не статический массив, согласись!


 
Eraser ©   (2005-09-09 23:11) [13]

iXT   (09.09.05 23:04) [12]

Это уж точно! )

DesWind ©   (09.09.05 23:02) [11]

Это можно сказать указатель, типа как PChar, но не совсем.

читай справку и рамблер!

AnsiString, also called a long string, represents a dynamically allocated string whose maximum length is limited only by available memory.

A long-string variable is a pointer occupying four bytes of memory. When the variable is empty--that is, when it contains a zero-length string--the pointer is nil and the string uses no additional storage. When the variable is nonempty, it points a dynamically allocated block of memory that contains the string value. The eight bytes before the location contain a 32-bit length indicator and a 32-bit reference count. This memory is allocated on the heap, but its management is entirely automatic and requires no user code.

Because long-string variables are pointers, two or more of them can reference the same value without consuming additional memory. The compiler exploits this to conserve resources and execute assignments faster. Whenever a long-string variable is destroyed or assigned a new value, the reference count of the old string (the variable"s previous value) is decremented and the reference count of the new value (if there is one) is incremented; if the reference count of a string reaches zero, its memory is deallocated. This process is called reference-counting. When indexing is used to change the value of a single character in a string, a copy of the string is made if--but only if--its reference count is greater than one. This is called copy-on-write semantics.


http://doc.trecom.tomsk.su/Delphi/DevelopersCorner/www.akzhan.midi.ru/devcorner/akdeltnt-content/akdeltnt-0033.html


 
DesWind ©   (2005-09-09 23:14) [14]

В чем я не прав?
A long-string variable is a pointer occupying four bytes of memory.

А вот за это я и получил четверку

The eight bytes before the location contain a 32-bit length indicator and a 32-bit reference count.


 
Eraser ©   (2005-09-09 23:19) [15]

DesWind ©   (09.09.05 23:14) [14]

Пустая строка действительно просто указатель - 4 байта, но
вообще string это не просто указатель! , т.к. When the variable is nonempty, it points a dynamically allocated block of memory that contains the string value. The eight bytes before the location contain a 32-bit length indicator and a 32-bit reference count.


 
DesWind ©   (2005-09-09 23:23) [16]

Понял...


 
Defunct ©   (2005-09-09 23:49) [17]

> DesWind
> В чем я не прав?
> A long-string variable is a pointer occupying four bytes of memory.
>А вот за это я и получил четверку

Технически экземпляр класса это тоже 32х битный указатель. Но почему-то String <> TObject, и более того даже TObject <> TComponent. Полагаю на экзамене требовалось рассказать о структуре на которую указывает String указатель.


 
DesWind ©   (2005-09-10 00:11) [18]

Defunct ©   (09.09.05 23:49) [17]

Ага, расказать "своими словами", что такое string. Я упомянул только размер. А в данном случае был не прав, относительно:

var
S: string;
begin
S := "";
...
end;

// 2
var
S: string;
begin
...
end;


Что это одно и тоже.


 
Pavel__   (2005-09-10 00:20) [19]

Понял, всем огромное спасибо.


 
DesWind ©   (2005-09-10 00:24) [20]

А может, и не сказал, про размер...


 
begin...end ©   (2005-09-10 08:28) [21]

> Defunct ©   (09.09.05 23:49) [17]

> Полагаю на экзамене требовалось рассказать о структуре на
> которую указывает String указатель.

А что про эту структуру можно рассказать? Переменная типа string указывает на начало тела строки.


 
atruhin ©   (2005-09-10 09:05) [22]

>>DesWind ©   (10.09.05 00:11) [18]
>>А в данном случае был не прав, относительно:
Как раз таки прав, т.к. для пустой строки делфи не создает структуру, а присваевает указателю значение nil


 
Defunct ©   (2005-09-10 16:27) [23]

begin...end ©   (10.09.05 08:28) [21]

это не все.


 
begin...end ©   (2005-09-10 16:58) [24]

> Defunct ©   (10.09.05 16:27) [23]

Что "не всё"? Управляющая структура находится перед телом строки. На эту структуру string-переменная не указывает.


 
Defunct ©   (2005-09-10 20:19) [25]

begin...end ©   (10.09.05 16:58) [24]
> Управляющая структура находится перед телом строки.

ну и что? хоть сбоку.
смещение -4 или -8, тоже смещение как и +4 и +8.


 
begin...end ©   (2005-09-11 00:12) [26]

> Defunct ©   (10.09.05 20:19) [25]

Пусть имеется код:

var
 A: array [1..2] of Longint;
 B: array [1..5] of Char;
 P: Pointer;
begin
 ...
 P := @B;
 ...
end.

Ответьте на вопрос (только односложно -- "да" или "нет"): правильно ли говорить, что после выполнения выделенной строки указатель P будет указывать на массив A?


 
Anatoly Podgoretsky ©   (2005-09-11 00:33) [27]

var
string = record
 count: integer;
 length: integer;
 body: array of char;
end

VarStr := string.body;
VarStr := nil;


 
Defunct ©   (2005-09-11 01:42) [28]

> begin...end

Если очередность всегда соблюдается, тогда правильно.
Отрицательное смещение широко применялось еще в MS-DOS структурах.


 
begin...end ©   (2005-09-11 10:16) [29]

> Defunct ©   (11.09.05 01:42) [28]

> Отрицательное смещение широко применялось еще в MS-DOS структурах.

Я не о том, применяется оно или нет. Я о том, что говорить "указатель указывает на X", тогда как P := @Y, где @Y < @X, некорректно.

Можно расширить пример. Например, в ВАП процесса, исполняемого в 32-разрядной Win2000, код и данные пользовательского режима расположены по адресам $00010000..$7FFEFFFF, а код и данные режима ядра -- начиная с адреса $800000000. Если P = $800000000, то говорить, что P является указателем на пользовательский код и данные, по-моему, абсурдно.


 
Наиль ©   (2005-09-11 12:38) [30]

>[29]
Что касается ВАП, то всё верно, т.к. это явление опредяляется ОС. И от среды программирования не зависит. Но для String обратное смещение обязательно. А потому, можно говорить об укателе на длину структуры.
Как если бы мы обратились к элементу в динамическом массиве. a[2] является допустимой записью. Хотя a не ссылается на прямую на второй (третий) элемент массива.
Если структура фиксирована в пределах среды, то обращение к ней через ссылки и смещения в пределах этой среды можно считать верными.

Но учитывая, настающее число Warning"ов в новых версиях Delphi, ни что не вечно под луной. Все проходит, пройдёт и это.


 
begin...end ©   (2005-09-11 13:23) [31]

> Наиль ©   (11.09.05 12:38) [30]

> А потому, можно говорить об укателе на длину структуры.

Я не утверждал, что нельзя говорить об указателе на длину структуры, вообще-то. Я говорил, что переменная типа string не является таким указателем.


 
Defunct ©   (2005-09-12 01:27) [32]

> begin...end © (11.09.05 10:16) [29]
> Я не о том, применяется оно или нет. Я о том, что говорить "указатель указывает на X",

Указатель указывает на данные. А уж содержатся ли полезные данные по отрицательному либо положительному смещению, зависит лишь только от структуры данных. АП ведь привел пример...

Приведу еще и я, более простой.

PMyRecord = ^TMyRecord;
TMyRecord = record
 A, B, C : integer
end;

var
 P : PMyRecord;
 MyRec : TMyRecord;
..
P := @MyRec;

вопрос, указывает ли P на поле C структуры TMyRecord будет по меньшей мере некорректым. P указывает на структуру типа TMyRecord, следовательно он косвенно указывает на все ее поля.


> Наиль ©
> Если структура фиксирована в пределах среды, то обращение к ней через ссылки и смещения в пределах этой среды можно считать верными.

Я бы сказал более строго - является верным.


 
begin...end ©   (2005-09-12 09:01) [33]

> Defunct ©   (12.09.05 01:27) [32]

> вопрос, указывает ли P на поле C структуры TMyRecord будет
> по меньшей мере некорректым.

Почему это? Он корректен. И ответ на него -- "нет". Потому что P указывает на начало структуры типа TMyRecord.


 
Anatoly Podgoretsky ©   (2005-09-12 09:41) [34]

Defunct ©   (12.09.05 01:27) [32]
Я не только это привел, а заодно показал каким образом обеспечена совместимость с PChar. А говорить об возможности положительных и отричательных смещения программисту как бы смешно, напоминает средневековье, когда не то что отричательных чисел не было, но даже и нуля!!!
Есть структура, есть фиксированый указатель в одни из опорных точек. То что не начало структуры, так что вам шашечки или ехать.


 
Defunct ©   (2005-09-13 00:12) [35]

Anatoly Podgoretsky ©   (12.09.05 09:41) [34]

не знаю, не вижу своей неправоты в этом вопросе.
VarStr будет указывать на всю структуру string (если не nil). Если это не так просто скажите "это не так".



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

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

Наверх




Память: 0.55 MB
Время: 0.053 c
1-1126287548
Michael5
2005-09-09 21:39
2005.10.02
Splitter при установке св-ва Panel3.Visible:=true отказывается


3-1124191166
diwww
2005-08-16 15:19
2005.10.02
сравнение даты с текущей


4-1123533538
ronyn
2005-08-09 00:38
2005.10.02
Как определить, запущен ли процесс?


1-1126262449
kblc
2005-09-09 14:40
2005.10.02
Фабрика COM-сервера


1-1126600658
keal
2005-09-13 12:37
2005.10.02
как сделать иконку в трее в консольной программе?