Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.11.2013, 17:47
mustimur mustimur вне форума
Прохожий
 
Регистрация: 20.11.2013
Сообщения: 17
Версия Delphi: Delphi xe4
Репутация: 10
Вопрос 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  
Старый 21.11.2013, 18:01
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

На какой строке падет?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 21.11.2013, 18:14
mustimur mustimur вне форума
Прохожий
 
Регистрация: 20.11.2013
Сообщения: 17
Версия Delphi: Delphi xe4
Репутация: 10
По умолчанию

до первого 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;
падает на oldLength := PDynArrayRec(p).Length; удивляет то что при обращении с другой кнопки работает...
Ответить с цитированием
  #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);

Последний раз редактировалось poli-smen, 21.11.2013 в 18:35.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
mustimur (22.11.2013)
  #5  
Старый 21.11.2013, 19:12
mustimur mustimur вне форума
Прохожий
 
Регистрация: 20.11.2013
Сообщения: 17
Версия Delphi: Delphi xe4
Репутация: 10
По умолчанию

Вы правы, я это переделал.. Но ошибка не исчезла она возникает в setLength, при это переменная определяющая размер integer, верное значение так что это моя ошибка, но не в этом проблема....
Ответить с цитированием
  #6  
Старый 22.11.2013, 21:05
mustimur mustimur вне форума
Прохожий
 
Регистрация: 20.11.2013
Сообщения: 17
Версия Delphi: Delphi xe4
Репутация: 10
Вопрос

Решение нашел с использованием TFileStream.
А до этого был какой-то глюк: трассил программу до первого BlockRead все массивы были определены (нормально), а вот после первого же на следующим шаге становились либо чушью набитыми либо имели значение inaccessible value, и при попытке обратится к ним потом с SetLength программа вылетала с ошибкой. с TFileStream такого нет.. Это я чего то не понял или у моего Delphi глюк?
Ответить с цитированием
  #7  
Старый 23.11.2013, 02:07
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
В "Blockread" указывают количество блоков для чтения
Но при этом устанавливается режим чтения по 8 байт.
Код:
Reset(f,sizeof(real)); 
ТС достаточно было изменить на
Код:
Reset(f, SizeOf(Integer)); 
t := 1;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #8  
Старый 23.11.2013, 02:36
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от angvelem
ТС достаточно было изменить на
Код:
Reset(f, SizeOf(Integer)); 
t := 1;
Или же, как я предлагал, сделать переменную файла типизированной байтом:
Код:
var
  f: file of Byte; // Вместо нетипизированного f: file;
Тогда в "Reset" не нужно указывать размер блока. И читать в соответствии с размером переменной: SizeOf(имя_переменной) вместо SizeOf(real).
Хотя всё равно вариант с TFileStream мне нравится больше
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:39.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter