Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как работать с частями/кусками pointer?


Автор: Jovi 21.11.2006, 18:40
Есть такая ситуация:

p : pointer

Myprocedure(p^,p^);

Эта процедура выполняет определенные действия с "p" и забивает результат обратно в "p".
НО! Эта процедура блочная - она обрабатывает за раз только по 8 байт.

Задача состоит в следующем: прогнать все данные "p" через эту процедуру, а не только первые 8 байт.

Еслиб это был array - другое дело, я бы указал с какого по какой байт мне нужно прогонять и сделал бы это через цикл.
А как такое с поинтером сделать - не знаю =(

Господа, заранее благодарю!

Автор: Snowy 21.11.2006, 18:43
Чтобы поинтер указал на слудеющие 8 байт, сделай так:
Код

  p := pointer(integer(p) + 8);

Автор: Jovi 21.11.2006, 19:06
TO Snowy: Большое спасибо. Сейчас буду пробывать.

Добавлено @ 19:14 
Что-то пока выдает invalid pointer operation =(

for I := 1 to 30 do 
begin
  MyProcedure(p^,p^);
  p := pointer(integer(p) + 8);
end;

Сам поинтер большой - 2000 байт... от 1 до 30 - это я для опыта выбрал...


Автор: drkot 21.11.2006, 19:20
Snowy
Код

asm
  inc p
end

все равно быстрее.  smile 

Добавлено @ 19:21 
Цитата(Jovi @  21.11.2006,  19:06 Найти цитируемый пост)
Сам поинтер большой - 2000 байт... от 1 до 30 - это я для опыта выбрал...

 smile 
поинтер это 4 байта

Добавлено @ 19:23 
Цитата(Jovi @  21.11.2006,  19:06 Найти цитируемый пост)
Что-то пока выдает invalid pointer operation =(

где выдает? в какой строке?

Автор: Jovi 21.11.2006, 19:37
Вот такой код.
В итоге он шифрует только первые 8 байт файла.
Задача состоит в том, чтобы он шифровал весь файл целиком. Для этого нужно зациклить Crypt на каждые 8 бит.
А у меня, к сожалению, не получается.

Код

var
 myfile : file;
 p : pointer;
 fs : integer;
 i : integer;
begin

  AssignFile(myfile,OpenDialog1.FileName);
  Reset(myfile,1);
  fs := FileSize(myfile);
  GetMem(p,fs);
  BlockRead(myfile,p^,fs);
  CloseFile(myfile);

  Cipher:= My.Create(nil);
  Cipher.Init(Key,Sizeof(Key)*8,nil);

for i := 1 to 30 do // для примера 30; тут, в общем-то, от длины файла плясать нужно.
begin
  Cipher.Decrypt(p^,p^);
end;

  Cipher.Reset;
  Cipher.Free;

  AssignFile(myfile,OpenDialog1.FileName);
  Reset(myfile,1);
  BlockWrite(myfile,p^,fs);
  CloseFile(myfile);

  FreeMem(p,fs);
 end;

Автор: drkot 21.11.2006, 19:54
Цитата(Jovi @  21.11.2006,  19:37 Найти цитируемый пост)
Cipher.Decrypt(p^,p^)

Ну вопервых необязательно ставить два параметра в процедуре. достаточно 1 и без домиков. Cipher.Decrypt(p). Так как это всеголишь указатель на память.

Во вторых: думаю тебе было бы проще использовать потоки для обработки, или создать массив из 8 байт и работать с ним. Либо серьезно разобраться в указателях.

Автор: Jovi 21.11.2006, 20:06
1. Без домиков выдает ошибку.

2. Насчет двух параметров - первый, что взять и зашифровать, второй - куда положить.

Про массив - тоже думал. НО! Что-то никак не могу придумать - как это сделать.

Предположим - есть массив: array of byte [0..7]

Как мне первые 8 байт памяти, на которую указывает поинтер загнать в этот массив, а потом следующие восемь и т.д.?

Добавлено @ 20:12 
Да, еще и при BlockRead я бы этот сраный поинтер заменил массивом и проблем бы не имел - вообще не связывался бы с поинтерами. Но при замене его массивом из 8 байт, ругается и не работает =((

Автор: drkot 21.11.2006, 20:16
Насколоко я понял это ТВОЯ (написанная тобой) процедура шифрования?

Цитата(Jovi @  21.11.2006,  20:06 Найти цитируемый пост)
1. Без домиков выдает ошибку.

p^ - данные на которые указавает указатель 1 байт
p - сам указатель 4 байта.

Писать здесь лекцию по использованию указателей нет ни сил ни желания. Возьми книжку (самую элементарную) по пасклю там и почитай раздел об указателях. Это самый логичный ход в данном случае. Подобные темы в книгах освещены очень хорошо.

Автор: Jovi 21.11.2006, 20:18
Моя-моя. Переделать мона, но не удобно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)