Цитата:
Сообщение от 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);