Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

А что представляет из себя переменная типа string [D7, WinXP]


Страницы:   1 2

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]

Понял...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо