![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
А что представляет из себя переменная типа string [D7, WinXP]
Pavel__ © (2005-09-09 21:38:00)...после объявления в var? И будет ли отличие при двух нижеследующих примерах:
// 1
var
S: string;
begin
S := '';
...
end;
// 2
var
S: string;
begin
...
end;
Заранее извиняюсь, если спросил глупость. С уважением.
Defunct (2005-09-13 00:12:00) [1]Anatoly Podgoretsky © (12.09.05 09:41) [34]
не знаю, не вижу своей неправоты в этом вопросе.
VarStr будет указывать на всю структуру string (если не nil). Если это не так просто скажите "это не так".
Anatoly Podgoretsky (2005-09-12 09:41:00) [2]Defunct © (12.09.05 01:27) [32]
Я не только это привел, а заодно показал каким образом обеспечена совместимость с PChar. А говорить об возможности положительных и отричательных смещения программисту как бы смешно, напоминает средневековье, когда не то что отричательных чисел не было, но даже и нуля!!!
Есть структура, есть фиксированый указатель в одни из опорных точек. То что не начало структуры, так что вам шашечки или ехать.
begin...end (2005-09-12 09:01:00) [3]> Defunct © (12.09.05 01:27) [32]
> вопрос, указывает ли P на поле C структуры TMyRecord будет
> по меньшей мере некорректым.
Почему это? Он корректен. И ответ на него -- "нет". Потому что P указывает на начало структуры типа TMyRecord.
Defunct (2005-09-12 01:27:00) [4]> 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-11 13:23:00) [5]> Наиль © (11.09.05 12:38) [30]
> А потому, можно говорить об укателе на длину структуры.
Я не утверждал, что нельзя говорить об указателе на длину структуры, вообще-то. Я говорил, что переменная типа string не является таким указателем.
Наиль (2005-09-11 12:38:00) [6]>[29]
Что касается ВАП, то всё верно, т.к. это явление опредяляется ОС. И от среды программирования не зависит. Но для String обратное смещение обязательно. А потому, можно говорить об укателе на длину структуры.
Как если бы мы обратились к элементу в динамическом массиве.a[2]является допустимой записью. Хотяaне ссылается на прямую на второй (третий) элемент массива.
Если структура фиксирована в пределах среды, то обращение к ней через ссылки и смещения в пределах этой среды можно считать верными.
Но учитывая, настающее число Warning'ов в новых версиях Delphi, ни что не вечно под луной. Все проходит, пройдёт и это.
begin...end (2005-09-11 10:16:00) [7]> Defunct © (11.09.05 01:42) [28]
> Отрицательное смещение широко применялось еще в MS-DOS структурах.
Я не о том, применяется оно или нет. Я о том, что говорить "указатель указывает на X", тогда как P := @Y, где @Y < @X, некорректно.
Можно расширить пример. Например, в ВАП процесса, исполняемого в 32-разрядной Win2000, код и данные пользовательского режима расположены по адресам $00010000..$7FFEFFFF, а код и данные режима ядра -- начиная с адреса $800000000. Если P = $800000000, то говорить, что P является указателем на пользовательский код и данные, по-моему, абсурдно.
Defunct (2005-09-11 01:42:00) [8]> begin...end
Если очередность всегда соблюдается, тогда правильно.
Отрицательное смещение широко применялось еще в MS-DOS структурах.
Anatoly Podgoretsky (2005-09-11 00:33:00) [9]
var
string = record
count: integer;
length: integer;
body: array of char;
end
VarStr := string.body;
VarStr := nil;
begin...end (2005-09-11 00:12:00) [10]> 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?
Defunct (2005-09-10 20:19:00) [11]begin...end © (10.09.05 16:58) [24]
> Управляющая структура находится перед телом строки.
ну и что? хоть сбоку.
смещение -4 или -8, тоже смещение как и +4 и +8.
begin...end (2005-09-10 16:58:00) [12]> Defunct © (10.09.05 16:27) [23]
Что "не всё"? Управляющая структура находится перед телом строки. На эту структуру string-переменная не указывает.
Defunct (2005-09-10 16:27:00) [13]begin...end © (10.09.05 08:28) [21]
это не все.
atruhin (2005-09-10 09:05:00) [14]>>DesWind © (10.09.05 00:11) [18]
>>А в данном случае был не прав, относительно:
Как раз таки прав, т.к. для пустой строки делфи не создает структуру, а присваевает указателю значение nil
begin...end (2005-09-10 08:28:00) [15]> Defunct © (09.09.05 23:49) [17]
> Полагаю на экзамене требовалось рассказать о структуре на
> которую указывает String указатель.
А что про эту структуру можно рассказать? Переменная типа string указывает на начало тела строки.
DesWind (2005-09-10 00:24:00) [16]А может, и не сказал, про размер...
Pavel__ (2005-09-10 00:20:00) [17]Понял, всем огромное спасибо.
DesWind (2005-09-10 00:11:00) [18]Defunct © (09.09.05 23:49) [17]
Ага, расказать "своими словами", что такое string. Я упомянул только размер. А в данном случае был не прав, относительно:
var
S: string;
begin
S := '';
...
end;
// 2
var
S: string;
begin
...
end;
Что это одно и тоже.
Defunct (2005-09-09 23:49:00) [19]> DesWind
> В чем я не прав?
> A long-string variable is a pointer occupying four bytes of memory.
>А вот за это я и получил четверку
Технически экземпляр класса это тоже 32х битный указатель. Но почему-то String <> TObject, и более того даже TObject <> TComponent. Полагаю на экзамене требовалось рассказать о структуре на которую указывает String указатель.
DesWind (2005-09-09 23:23:00) [20]Понял...