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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работать с частями/кусками pointer? Pointer to array 
:(
    Опции темы
Jovi
Дата 21.11.2006, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.11.2006

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



Есть такая ситуация:

p : pointer

Myprocedure(p^,p^);

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

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

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

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

PM MAIL   Вверх
Snowy
Дата 21.11.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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

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

PM MAIL   Вверх
Jovi
Дата 21.11.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.11.2006

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



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 - это я для опыта выбрал...


PM MAIL   Вверх
drkot
Дата 21.11.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



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 =(

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


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Jovi
Дата 21.11.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.11.2006

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



Вот такой код.
В итоге он шифрует только первые 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;

PM MAIL   Вверх
drkot
Дата 21.11.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



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

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

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



--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Jovi
Дата 21.11.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.11.2006

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



1. Без домиков выдает ошибку.

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

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

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

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

Добавлено @ 20:12 
Да, еще и при BlockRead я бы этот сраный поинтер заменил массивом и проблем бы не имел - вообще не связывался бы с поинтерами. Но при замене его массивом из 8 байт, ругается и не работает =((
PM MAIL   Вверх
drkot
Дата 21.11.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



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

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

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

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



--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Jovi
Дата 21.11.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.11.2006

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



Моя-моя. Переделать мона, но не удобно.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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