Показать сообщение отдельно
  #4  
Старый 21.11.2013, 18:17
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от mustimur
Доброго времени суток Всем

Опять появилась проблема: при обращении к Setlength выдается ошибка:
"Access violation at address ........ in module 'Project1.exe'. Read of address ........
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
f: file;
g:variant;
i,j,k,t,zs,s:integer;
fn:string;
xc,yc,zc, nx,ny,nz,dln:real;
series2:Tpoint3dseries;
begin
.....
  Reset(f,sizeof(real));
  t:=sizeof(real);
  Blockread(F,  s,t);
  Blockread(F,  nlob ,t); form1.edtLobels.Text:=floattostr( nlob);
  Blockread(F,  i ,t); form1.edtKsi.Text:=floattostr( ig);
  Blockread(F,  j ,t); form1.edteta.Text:=floattostr( jg);
  Blockread(F,  k ,t); form1.edtzeta.Text:=floattostr( kg);
.....
Хотя при вызове всего из другой процедуры (другой кнопки) все работает! Отличие одно там не читается из файла информация, а берется из формы... Как такое может быть???
У тебя переменные в которые ты читаешь имеют длину 4 байта (так как типа Integer), а ты в них читаешь по 8 байт (так как тип Real занимает 8 байт).

UPD
Хотя даже не 8 байт. В "Blockread" указывают количество блоков для чтения, а не количество байт, а так как у тебя нетипизированный файл, то там будет читаться значительно больше, при этом будет затираться стек и валиться программа.
Т.е. сделай файл типизированный байтом:
Код:
var
  f: file of Byte; // Вместо нетипизированного f: file;
(Или ещё лучше переделай через класс TFileStream)

И читай по размеру своих переменных:
Код:
  Blockread(F, s, SizeOf(s));
  Blockread(F, nlob, SizeOf(nlob)); form1.edtLobels.Text:=floattostr( nlob);
  Blockread(F, i, SizeOf(i)); form1.edtKsi.Text:=floattostr( ig);
  Blockread(F, j, SizeOf(j)); form1.edteta.Text:=floattostr( jg);
  Blockread(F, k, SizeOf(k)); form1.edtzeta.Text:=floattostr( kg);
Ответить с цитированием