Текущий архив: 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