Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.29;
Скачать: CL | DM;

Вниз

Про память   Найти похожие ветки 

 
unfam ©   (2002-08-20 02:47) [0]

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

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

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


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

Уважаемый, таких как вы в приличных местах бьют палками и гонят прочь. Почему ума на то чтоб копаться в исходниках 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.


 
unfam ©   (2002-08-20 05:37) [2]

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

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


 
MBo ©   (2002-08-20 06:50) [3]

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


 
unfam ©   (2002-08-20 07:33) [4]

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

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


 
MBo ©   (2002-08-20 07:46) [5]

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

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

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



 
unfam ©   (2002-08-20 07:54) [6]

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



Страницы: 1 вся ветка

Текущий архив: 2002.08.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
1-95792
Riko
2002-08-19 17:39
2002.08.29
Очистки кеша


3-95674
zx
2002-08-08 12:20
2002.08.29
MDAC


3-95636
exciter_
2002-08-07 15:34
2002.08.29
IB6. Доступ к таблице в другой GDB.


3-95711
Alameyda
2002-08-07 15:33
2002.08.29
По IB6. С процедуры получить доступ к таблице в другом GDB.


6-95919
BlackSun
2002-06-18 17:39
2002.08.29
Как переслать по сети изображение?