![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Про память
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.