![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток Всем
Опять появилась проблема: при обращении к Setlength выдается ошибка: "Access violation at address ........ in module 'Project1.exe'. Read of address ........ Код:
var
Form1: TForm1;
//Pi:real;
np, nlob, ig,jg,kg,napr: integer;
xprof, yprof, Lprof, mksi,meta,mzeta: Array of real;
mx: array of array of array of real;
my: array of array of array of real;
implementation
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
if od1.Execute then
begin
fn:=od1.FileName;
AssignFile(F, fn);
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);
closefile(f);
jg:=j;
ig:=i;
kg:=k;
np:=s;
if ( napr=-1) then form1.optright.Checked:=true else form1.optleft.Checked:=true;
setlength( xprof, np+1);
setlength( yprof, np+1);
setlength( lprof, np+1);
setlength( mksi , ig+1);
setlength( meta , jg+1);
setlength( mzeta , kg+1);
setlength( mx, ig+1, jg+1, kg+1);
setlength( my, ig+1, jg+1, kg+1);
end;Последний раз редактировалось mustimur, 21.11.2013 в 17:51. |
|
#2
|
||||
|
||||
|
На какой строке падет?
|
|
#3
|
|||
|
|||
|
до первого setlength идет, а дальше падает...
ошибка якобы в строке юнита System, вызываемого setlength: Код:
procedure DynArraySetLength(var a: Pointer; typeInfo: Pointer; dimCnt: NativeInt; lengthVec: PNativeint);
var
i,j: NativeInt;
newLength, oldLength, minLength: NativeInt;
elSize: NativeInt;
neededSize: NativeInt;
p, pp: Pointer;
begin
p := a;
// Fetch the new length of the array in this dimension, and the old length
newLength := lengthVec^;
if newLength <= 0 then
begin
if newLength < 0 then
Error(reRangeError);
DynArrayClear(a, typeInfo);
exit;
end;
oldLength := 0;
if p <> nil then
begin
Dec(PByte(p), SizeOf(TDynArrayRec));
oldLength := PDynArrayRec(p).Length;
end; |
|
#4
|
||||
|
||||
|
Цитата:
UPD Хотя даже не 8 байт. В "Blockread" указывают количество блоков для чтения, а не количество байт, а так как у тебя нетипизированный файл, то там будет читаться значительно больше, при этом будет затираться стек и валиться программа. Т.е. сделай файл типизированный байтом: Код:
var f: file of Byte; // Вместо нетипизированного f: file; И читай по размеру своих переменных: Код:
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); Последний раз редактировалось poli-smen, 21.11.2013 в 18:35. |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
mustimur (22.11.2013)
| ||
|
#5
|
|||
|
|||
|
Вы правы, я это переделал.. Но ошибка не исчезла она возникает в setLength, при это переменная определяющая размер integer, верное значение
так что это моя ошибка, но не в этом проблема.... |
|
#6
|
|||
|
|||
|
Решение нашел с использованием TFileStream.
А до этого был какой-то глюк: трассил программу до первого BlockRead все массивы были определены (нормально), а вот после первого же на следующим шаге становились либо чушью набитыми либо имели значение inaccessible value, и при попытке обратится к ним потом с SetLength программа вылетала с ошибкой. с TFileStream такого нет.. Это я чего то не понял или у моего Delphi глюк? |
|
#7
|
||||
|
||||
|
Цитата:
Код:
Reset(f,sizeof(real)); Код:
Reset(f, SizeOf(Integer)); t := 1; |
|
#8
|
||||
|
||||
|
Цитата:
Код:
var f: file of Byte; // Вместо нетипизированного f: file; Хотя всё равно вариант с TFileStream мне нравится больше ![]() |