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

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

Про память


unfam ©   (2002-08-20 02:47:00) 

Здравствуйте. Сижу и разглядываю код функции StrAlloc - просто интересно. Не мог бы кто разъяснить мне суть следующего фрагмента:

GetMem(Result, Size)
Cardinal(Pointer(Result)^) := Size; - особенно это присваивание.
Inc(Result, SizeOf(Cardinal));

Причем на этом код функции заканчивается. Result должен быть PChar - до меня просто не доходит, а хочется.


unfam   (2002-08-20 07:54:00) [1]

>MBo. Большое спасибо. Просто мой ход мысли был с ног на голову. Спасибо еще раз.


MBo   (2002-08-20 07:46:00) [2]

>записываем Size в 4 байта перед
записываем в текущий адрес, на который указывает result, потм смещаем result

>некоторое значение разместить, скажем, в двух байтах сразу после выделенного участка,
тогда надо предусмотреть выделение памяти сразу и под эти 2 байта

Getmem(p,size+2)
inc(p,size)
pword(p)^:=666


unfam   (2002-08-20 07:33:00) [3]

>MBo Система такая. GetMem выделяет память и Result на нее указывает. Далее мы записываем Size в 4 байта перед. А затем Inc возращает нас снова к первому символу. Это все ясно. Вот как раз мне и не понятно, как с помощью конструкции с Cardinal (...) мы попадаем в нужное место. Спрошу по другому. А если бы
я захотел написать сам нечто подобное, но некоторое значение разместить, скажем, в двух байтах сразу после выделенного участка, как бы я должен был написать ?

Прошу не сердиться на тупоумие.


MBo   (2002-08-20 06:50:00) [4]

>и объяснить как с помощью выражения Cardinal(Pointer(Result)^) мы попадаем в эти самые предшествущие байты
как раз следующая строка с Inc переводит указатель на Result на 4 байта далее, так что возвращается адрес, ПЕРЕД которым лежит размер


unfam   (2002-08-20 05:37:00) [5]

>ASV2. А, я понял откуда возникают темы - "Я ухожу - менэ не понимают". :) А help я, разумеется, читал. То есть вы говорите, что именно Cardinal(Pointer(Result)^) := Size записывает в предшествущие первому символу 4 байта отведенный размер, я правильно вас понимаю ? Не могли бы вы, отбросить палку :) и объяснить как с помощью выражения Cardinal(Pointer(Result)^) мы попадаем в эти самые предшествущие байты.

Спасибо за терпение.


ASV2   (2002-08-20 04:56:00) [6]

Уважаемый, таких как вы в приличных местах бьют палками и гонят прочь. Почему ума на то чтоб копаться в исходниках VCL у вас хватило, а нажать Ctrl+F1 - нет? Почему это за вас должен делать я?
Вот эти вопросы действительно не доходят!
-----
function StrAlloc(Size: Cardinal): PChar;
Description

StrAlloc allocates a buffer for a null-terminated string with a maximum length of Size - 1 (1 byte must be reserved for the termination character). The result points to the location where the first character of the string is to be stored. A 32-bit number giving the total amount of memory allocated is stored in the four bytes preceding the first character; it is equal to Size + 4. If space for a string is allocated with StrAlloc, it should be deallocated via StrDispose.

Because long strings are implicitly null terminated and dynamically allocated, the use of StrAlloc is in decline.


Наверх

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