Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работать с указателями? 
:(
    Опции темы
RideX
Дата 24.4.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Здравствуйте! Подскажите пожалуйста, как работать с указателями, не знаю как это сделать без асма? :-/ Вот пример:
Код

// Some code...
 pMemory := MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
 MainStruct := pMemory;
 asm
  mov eax, dword ptr[MainStruct]
  add eax,14 // SizeOf(MainStruct)
  mov dword ptr[SubStruct],eax
 end;
 
// Some code...

 asm
  mov eax, dword ptr[SubStruct]
  add eax,4
  mov ecx,i // i = SubStruct.Length;
  mov dx,wSign
  @loop:
    add eax,1
    cmp word ptr[eax],dx
    je @found

    dec ecx
    test ecx,ecx
    jnz @loop
    xor eax,eax
    mov dword ptr[pPos],eax
    jmp @end

  @found:
    and eax,0000FFFFh
    mov dword ptr[pPos],eax

  @end:
 end;

// Some code...
 
PM   Вверх
Albinos_x
Дата 24.4.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



DRKB (Delphi Russian Knowledge Base)

Цитата

 var  
  p1 : ^String;  
 s1 : String;  
  begin  
  s1 := 'NotTest';  
 new (p1);  
 p1 := @s1;  
 p1^ := 'Test';  
 Label1.Caption := s1  

Цитата

Арифметика указателей 
 
Сначала короткое объяснение арифметике указателя. Когда вы имеете дело с динамическими страницами памяти, то все, что вы имеете - это указатели на начала блоков памяти. Вы хотите просмотреть всю строку памяти, чтобы понять какие функции необходимы для работы с данными, хранящимися в памяти? Это возможно путем изменения места в памяти, на которое указывает указатель. Это называется арифметикой указателя. 
Основополагающая идея при занятиях арифметикой с указателем - указатель должен быть увеличен на значение корректного приращения. (Корректное приращение определяется размером объекта, на который показывает указатель. Например, char = 1 байт; integer = 2 байта; double = 8 байт и т.д.) Функции Inc() и Dec() изменяют значение корректного приращения. (Компилятор знает правильный размер объекта.) 
Если вы осуществляете динамическое распределение памяти, то делать это можно примерно так: 

uses WinCRT; 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  MyArray: array[0..30] of char; 
  b: ^char; 
  i: integer; 
begin 
  StrCopy(MyArray, 'Дельфи - рулез фарева!'); 
    {помещаем что-то в память для организации указателя} 
  b := @MyArray; { назначаем указатель на текущую позицию памяти } 
  for i := StrLen(MyArray) downto 0 do 
  begin 
    write(b^); { пишем символ в текущую позицию указателя. } 
    inc(b); { перемещаем указатель на следующий байт памяти } 
  end; 
end; 

Нижеследующий код демонстрирует работу функций Inc() и Dec(), увеличивающих или уменьшающих указатель на размер соответствующего типа: 

var 
  P1, P2: ^LongInt; 
  L: LongInt; 
begin 
  P1 := @L; { назначаем оба указателя на одно и то же место } 
  P2 := @L; 
  Inc(P2); { Увеличиваем один } 
  { Здесь мы получаем разницу между смещениями двух 
  указателей. Поскольку первоначально они указывали на одно 
  и то же место памяти, то результатом данного вызова 
  будет разница между двумя указателями после вызова Inc(). } 
  L := Ofs(P2^) - Ofs(P1^); { L = 4; т.е. sizeof(longInt) } 
end; 

Вы можете изменить тип объекта, на который указывает P1 и P2, на какой-то другой и убедиться, что (SizeOf(P1^)) всегда возвращает величину корректного приращения (проще сказать, что это размер объекта - В.О.). 
 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RideX
Дата 24.4.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Цитата(Albinos_x @  24.4.2006,  19:33 Найти цитируемый пост)
Функции Inc() и Dec() изменяют значение корректного приращения.

Ага, вот в чём фишка! Ну теперь всё понятно, сорри за ламеризм %) Вот решение по навигации в памяти на примере элементарного поиска сигнатуры в файле.

Код

procedure TForm1.Button1Click(Sender: TObject);
const
  wSign: WORD = $3231;
var
  hFile: THandle;
  szFileName: PChar;
  fSize, i, n: DWORD;

  hFileMap: THandle;
  pMemory : Pointer;
  pPos    : Pointer;
begin
 if not OpenDialog1.Execute then
  Exit;

 Memo1.Clear;
 szFileName := PChar(OpenDialog1.FileName);
 Edit1.Text := szFileName;

 hFile := CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, nil,
                                           OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 fSize := GetFileSize(hFile, nil);
 hFileMap := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil);
 pMemory := MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);

 n := 0;
 pPos := pMemory;
 for i := 0 to fSize - 1 do begin
  if WORD(pPos^) = wSign then begin
    n := i;
    Break;
  end;
  Inc(DWORD(pPos));
 end;

 UnmapViewOfFile(pMemory);
 CloseHandle(hFileMap);
 CloseHandle(hFile);

 Memo1.Lines.Add('Filesize: ' + IntToStr(fSize));
 Memo1.Lines.Add('Founded in: ' + IntToHex(n, 8));
end;
  

Это сообщение отредактировал(а) RideX - 24.4.2006, 20:42
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.