|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Access violation at address
Доброго времени суток Всем
Опять появилась проблема: при обращении к 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
|
||||
|
||||
На какой строке падет?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
||||
|
||||
Цитата:
Код:
var f: file of Byte; // Вместо нетипизированного f: file; Хотя всё равно вариант с TFileStream мне нравится больше |