Текущий архив: 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.45 MB
Время: 0.006 c