![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка доступа к памяти (указатели)
Mer01 © (2010-03-15 01:12:00)
function RTEACrypt(ap: PIntArray; bp: PIntArray): LongInt;
begin
a := ap[0];// Ошибка
//...
procedure DataCrypt(Input:Pointer; Ouput: Pointer; Len:LongInt);
begin
while Len > 0 do
begin
RTEACrypt(Input, Ouput);
inc(PIntArray(Input), SizeOf(TIntArray));
inc(PIntArray(Ouput), SizeOf(TIntArray));
dec(Len, SizeOf(TIntArray));
end;
end;
procedure DataDecrypt(Input:Pointer; Ouput: Pointer; Len:LongInt);
begin
while Len > 0 do
begin
RTEADecrypt(Input, Ouput);
inc(PIntArray(Input), SizeOf(TIntArray));
inc(PIntArray(Ouput), SizeOf(TIntArray));
dec(Len, SizeOf(TIntArray));
end;
end;
procedure StrToKey(Pass:String; var key: TKey);
begin
end;
procedure TMainForm.CryptBtnClick(Sender: TObject);
var
s: String;
begin
s := 'Текст, Text';// ЕСЛИ ЗАДАТЬ ТАК ТО ОШИБКА
//s := Memo.Lines.Text; ЕСЛИ ТАК ТО ОШИБКИ НЕТ!
DataCrypt(@s, @s, Length(s));
Memo.Lines.Add(s);
DataDecrypt(@s, @s, Length(s));
Memo.Lines.Add(s);
end;
Ошибка происходит после первой итерации.
Mer01 (2010-03-15 14:43:00) [1]Хм... PChar(s) - уже делал, вызывало туже ошибку, а вот @s[1] почему-то сработало O_o Спасибо)
Сергей М. (2010-03-15 08:23:00) [2]
> Mer01 (15.03.10 07:53) [3]
> s := 'Текст, Text';// ЕСЛИ ЗАДАТЬ ТАК ТО ОШИБКА
И это совершенно нормально.
Константы-литералы размещаются в секции данных, страницы которой имеют readonly-атрибут прав доступа.
> как куда? На s: String;
А надо не на s: String, а на буфер строковых данных, управляемый этой переменной:
DataCrypt(PChar(s), PChar(s), Length(s));
что эквивалентно
DataCrypt(@s[1], @s[1], Length(s));
MBo (2010-03-15 08:15:00) [3]>Тоесть как куда? На s: String;
Стоит разобраться, на какое именно место строки указывает.
Mer01 (2010-03-15 07:53:00) [4]Тоесть как куда? На s: String;
MBo (2010-03-15 05:48:00) [5]куда указывает @s ?
Германн (2010-03-15 01:34:00) [6]
> s := 'Текст, Text';// ЕСЛИ ЗАДАТЬ ТАК ТО ОШИБКА
Если задать так, s ссылается на область памяти в кодовом сегменте. Имхо.