Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
1-95772
Дмитрий Иванов
2002-08-19 03:14
2002.08.29
рисуем меню


1-95818
Лана Розанова
2002-08-16 16:03
2002.08.29
Help-Files


3-95651
SlavaK
2002-08-07 18:11
2002.08.29
Delphi-SQLServer


1-95810
Aszbed
2002-08-20 09:30
2002.08.29
Delohi for lamers :)


1-95842
Balu
2002-08-15 21:28
2002.08.29
MDI Form в DLL ошибка Can not assign TFont to TFont при OnHint





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский