Работа с указателями, память
Способ преобразования указателей на указатели на функции
Часто вам нужно указатель на функцию для функции обратного вызова. Но то, что ,
если вы хотите указать метод обратного вызова , как? Преобразованиеметода
Указатель на функцию указателя не является тривиальной задачей, оба типа
incomatible друг с другом. Хотя у вас есть возможность преобразования ,
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
StrAlloc непосредственно использует GetMem, поэтому обе функции живут за счет Кучи. StrAlloc имеет преимущество: он распределяет на два байта больше, чем вы просите и там хранит размер размещенного блока. Поэтому StrDispose знает сколько памяти освободить и вы можете этого не помнить (в отличие от GetMem/FreeMem). Не смешивайте при работе эти две функциональные пары, иначе вы будете потрясены количеством возникающих ошибок!
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
Я создал простой модуль и разработал несколько простых методов, помогающих избежать использования неактуальных (в оригинале было "stale" - черствый, несвежий) указателей. Я настоятельно рекомендую добавить во все модули, содержащие указатели или объектные переменные секцию инициализации ('initialization') и установить все указатели (объектные переменные это те же реальные указатели) в nil. Что это даст:
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
Сначала короткое объяснение арифметике указателя. Когда вы имеете дело с динамическими страницами памяти, то все, что вы имеете - это указатели на начала блоков памяти. Вы хотите просмотреть всю строку памяти, чтобы понять какие функции необходимы для работы с данными, хранящимися в памяти? Это возможно путем изменения места в памяти, на которое указывает указатель. Это называется арифметикой указателя.
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
Тут мы рассмотрим несоклько примером освобождения памяти.
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
Я ищу функцию, которая была бы эквивалентом сишной функции memcmp.
Я создал следующие две функции, существенно повышающие произвотельность в приложениях, активно работающих с данными. Вам нужно всего-лишь обеспечить контроль типов и границ допустимого диапазона, все остальное они сделают с любым типом данных лучше нас :-) .
Code: |
function Keys_are_Equal(var OldRec, NewRec; KeyLn : word): boolean; assembler; asm PUSH DS MOV AL,01 CLD LES DI,NewRec LDS SI,OldRec MOV CX,KeyLn CLI REPE CMPSB STI JZ @1 XOR AL,AL @1: POP DS end; |
Code: |
function First_Key_is_Less(var NewRec, OldRec; Keyln : word): boolean; assembler; asm PUSH DS MOV AL,01 CLD LES DI,NewRec LDS SI,OldRec MOV CX,KeyLn CLI REPE CMPSB STI JZ @5 JGE @6 @5: XOR AL,AL @6: POP DS end; |
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
Если вы хотите удалить переменную, что никакая другая программа не может прочитать из памяти больше, просто используйте эту функцию:
Code: |
ZeroMemory(Addr(yourVar), SizeOf(yourVar)); ZeroMemory(Addr(yourStr), Length(yourStr)); // ZeroMemory(Address of the variable, Size of the variable); |
Очень полезно, если вы задали пароль, и вы хотите, что никто другой не может его получить.
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
Code: |
uses WinCRT;
procedure TForm1.Button1Click(Sender: TObject); var MyArray: array[0..30] of char; b: ^char; i: integer; begin StrCopy(MyArray, 'Delphi World - это круто!!!'); b := @MyArray; for i := StrLen(MyArray) downto0do begin write(b^); inc(b, sizeof(char)); end; end; |
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
Code: |
{ **** UBPFD *********** by delphibase.endimus .com **** >> Получение размера памяти выделенный под Pointer
Функция возврящает количество байт выделенных под Pointer. Размер округляется в большую сторону до DWORD (4 байт).
Зависимости: Windows Автор: Мироводин Дмитрий, mirovodin mail.ru Copyright: Мироводин Дмитрий Дата: 16 октября 2013 г. ***************************************************** }
function GetPointerSize(const P: Pointer): Integer; begin if P = nilthen Result := -1 else Result := Integer(Pointer((Integer(p) - 4))^) and$7FFFFFFC - 4; end; Пример использования:
var P: pointer; PSize: integer; begin GetMem(P, 1024); // Размер кратен 4 PSize := GetPointerSize(P); ShowMessage(inttostr(PSize)); // Результат 1024 байта FreeMem(P); end;
...
var P: pointer; PSize: integer; begin // Размер НЕ КРАТЕН 4 GetMem(P, 6); PSize := GetPointerSize(P); // Результат 8 байта т.к. идет округление ShowMessage(inttostr(PSize)); FreeMem(P); end; |
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
Сначала вы должны создать тип:
Code: |
Type Pinteger : ^Integer;
Var MyPtr : Pinteger; |
Мне кажется, что в начале вы использовали плохой пример, имеет смысл использовать 32-битный указатель для 16-битной величины или распределять 10 байт для переменной.
Pascal позволяет вам использовать методы NEW и DISPOSE, которые автоматически распределяют и освобождают правильные размеры блока.
Например:
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
...мне также понадобилось в подпрограмме получить ссылку на дочернее MDI-окно без сообщения подпрограмме с каким конкретно классом MDI необходимо работать. Что я сделал: я передавал в виде параметров тип дочернего MDI-окна и ссылку как нетипизированную переменную и затем обрабатывал это в подпрограмме.
Вот пример. Эта подпрограмма работает с дочерним окном, которое может иметь только один экземпляр. Если оно не открыто, подпрограмма создаст его, если оно открыто, оно переместит его на передний план.
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с указателями, память
Страница 1 из 2