Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с файлами [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]

пишет что не в ту область памяти лезу ..


Наверх

Титульная страница Поиск, карта сайта Написать письмо