![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с файлами [D7, WinXP]
Женя © (2010-09-22 19:24:00)Помогите разобраться пожалуйста. пишу небольшую программу,
и тут непонятная ошибка. Выскакивает при завершении процедуры (после сообщения "проверка")
procedure Write;
var x,s:string; i,j:integer; k:integer;
begin
AssignFile(f1,Form1.Edit1.Text);
Reset(f1);
SetLength(fp,Form1.Memo1.Lines.Count+1);
for k:=0 to Form1.Memo1.Lines.Count-1 do begin
ShowMessage(IntToStr(k));
AssignFile(f2,Form1.Memo1.Lines.Strings[k]);
ShowMessage(Form1.Memo1.Lines.Strings[k]);
Reset(f2);
seek(f1,FileSize(f1));
fp[k].size:=FileSize(f2);
fp[k].Lst:=FileSize(f1);
While not eof(f2) do
begin
BlockRead(f2,x,1);
BlockWrite(f1,x,1);
{ inc(i);
if i=10 then begin
BlockWrite(f1,x,1);
i:=0;
end; }
end;
CloseFile(f2);
{if i<>0 then BlockWrite(f1,x,1);}
fp[k].Lend:=FileSize(f1);
end;
for j:=0 to Form1.Memo1.Lines.Count-1 do begin
s:='<~b><s>'+IntToStr(fp[j].size)+'<st>'+IntToStr(fp[j].Lst)+'<e>'+IntToStr(fp[j].Lend)+'<~e>';
for i:=1 to Length(x)-1 do BlockWrite(f1,x[i],sizeof(char));
end;
CloseFile(f1);
ShowMessage('проверка');
end;
Женя (2010-09-23 15:43:00) [1]спасибо ;)
han_malign (2010-09-23 08:27:00) [2]
> строка x нигде не инициализировалась, так что буфер не создан
> → имеем AV.
младший байт ссылки на строку xинициализирован BlockRead(f2,x,1) - при выходе из процедуры compiler magic пытается освободить ненулевую ссылку на строку...
З.Ы. для всех динамических магических переменных компилятор генерирует код инициализации в преамбуле функции и код "финализации" в неявной секции try finally...
Германн (2010-09-23 01:57:00) [3]Вообще-то в сабже ошибок столько, что я могу лишь дать ссылку на лицей http://www.delphikingdom.com/lyceum/seminar.asp?ID=2
RWolf (2010-09-23 01:43:00) [4]прежде чем читать блок данных в буфер, надо выделить под него память.
строка x нигде не инициализировалась, так что буфер не создан → имеем AV.
sniknik (2010-09-22 22:32:00) [5]> BlockRead(f2, x,1);
Германн (2010-09-22 22:28:00) [6]
> Женя (22.09.10 22:00) [4]
Во-первых процедура Reset имеет два параметра. И хоть второй необязательный про него настоятельно рекомендуется прочитать в справке.
Женя (2010-09-22 22:00:00) [7]>>>>Access violation at address 0000000.Read of address 00000000.
причем все действия выполняются правильно (файл f1 пополняется)
mike (2010-09-22 21:34:00) [8]
> случайно не твой ли это перевод?
Небось beyond the end of the file
Anatoly Podgoretsky (2010-09-22 19:45:00) [9]> Женя (22.09.2010 19:30:01) [1]
Так и пишет, а случайно не твой ли это перевод?
Женя (2010-09-22 19:30:00) [10]пишет что не в ту область памяти лезу ..