Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Inaccessible value, нет доступа к элементу.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 95
В общем я понимаю, что где-то накосячил, но не могу понять где.
procedure TForm2.Button2Click(Sender: TObject);
var
N,M,i,j:integer;
Vmin,Vmax,Lmin,Lmax,x0,alf,kv,kl:real;
SortArray:array of TmpPoint;
NearestValues:array of array of TmpPoint;
  + Procedure SortBaseArrayByRo (Poz,Vol,x0,alf,kv,kl:real; nLine:integer; var TmpArr:array of TmpPoint);
  + Function RoMath (Poz,Vol,kl,kv:real;i,j:integer):real;
  + Function SumRoMath (Poz,Vol,x0,alf,kv,kl:real):real;
  + Function FPointMath (Poz,Vol,x0,alf,kv,kl:real):real;  
  + Procedure CreateSurfaceMath(N,M:integer; Vmin,Vmax,Lmin,LMax,x0,alf,kv,kl:real);
 
begin
   form2.Memo1.Lines.Add('___1___');
  CreateSurfaceMath (N,M,Vmin,VMax,Lmin,LMax,x0,alf,kv,kl);
   form2.Memo1.Lines.Add('___2___');

  Form3.Image1.Picture:=nil;
   Drawaxis;
   Drawpixel;
   Drawlines;
end;

Первый form2.Memo1.Lines.Add('___1___') пишет, на втором form2.Memo1.Lines.Add('___2___'); пишет "нет доступа по адресу" при прерывании выполнения в Делфе рисует:
Картинка с другого сайта.
Картинка с другого сайта.
Внутри процедур есть ещё процедуры, они последовательно вызывают друг друга, писать весь код бессмысленно: стыдно и много его очень.

По сути из процедуры Button2Click вызывается внутренняя процедура CreateSurfaceMath (проверка показал что оттуда доступ работает), из неё вызывается в цикле FPointMath ну и так далее (там есть ещё и внутренние процедуры, в общем много всего). Долгий поиск момента потери доступа показал, что доступ выпадает где-то в этой процедуре, при том даже не на первом или втором шаге, а фиг знает на каком.

 Procedure SortBaseArrayByRo (Poz,Vol,x0,alf,kv,kl:real; nLine:integer; var TmpArr:array of TmpPoint);
    var
    //  TmpArr:array of TmpPoint;
     LTmpPoint:TmpPoint;
     j,k:integer;
    Function Ro (Poz,Vol,kl,kv:real;i,j:integer):real;
       begin
        Ro :=sqrt(sqr(BaseArr[i].Mass[j].Pos-Poz)*sqr(kl)+sqr(BaseArr[i].Mass[j].Vol-Vol)*sqr(kl));
       end;
    begin

      for j := 1 to BaseArr[nLine].Size do
        begin
          TmpArr[j].Pos  := BaseArr[nLine].Mass[j].Pos;
          TmpArr[j].Vol  := BaseArr[nLine].Mass[j].Vol;
          TmpArr[j].Force:= BaseArr[nLine].Mass[j].Force;
          TmpArr[j].Ro   := Ro (Poz,Vol,kl,kv,nLine,j);
        end;

     for j := 1 to 31 do
       for k := BaseArr[nLine].Size-j+1 downto 2 do
        begin
          if TmpArr[k].Ro<TmpArr[k-1].Ro then
            begin
             LTmpPoint.Ro:=TmpArr[k].Ro;
             TmpArr[k].Ro:=TmpArr[k-1].Ro;
             TmpArr[k-1].Ro:=LTmpPoint.Ro;

             LTmpPoint.Vol:=TmpArr[k].Vol;
             TmpArr[k].Vol:=TmpArr[k-1].Vol;
             TmpArr[k-1].Vol:=LTmpPoint.Vol;

             LTmpPoint.Force:=TmpArr[k].Force;
             TmpArr[k].Force:=TmpArr[k-1].Force;
             TmpArr[k-1].Force:=LTmpPoint.Force;

             LTmpPoint.Pos:=TmpArr[k].Pos;
             TmpArr[k].Pos:=TmpArr[k-1].Pos;
             TmpArr[k-1].Pos:=LTmpPoint.Pos;
            end;
        end;
      //  for j := 1 to BaseArr[nLine].Size do    form2.Memo1.Lines.Add(floattostr(TmpArr[j].Ro));
    end;


При том если не обращаться к элементам формы всё продолжает считаться и вполне себе досчитается до правильных результатов, но вот к некоторым элементам формы я уже обратится не могу, как быть и где искать ошибку... Может это что-то тривиальное?
15 май 18, 15:42    [21410991]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 95
Чего-то картинки не так загрузил...
Картинка с другого сайта.
Картинка с другого сайта.
15 май 18, 15:43    [21410995]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 95
И ошибка кстати выскакивает не по основному модулю а по:
Картинка с другого сайта.
15 май 18, 15:51    [21411023]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24312
Форма где-то удаляется?
15 май 18, 15:53    [21411030]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 95
wadman,

Нет. Ничего не удаляется и не изменяется. Возможно я что-то намудрил с динамическими массивами, так как на определённом этапе всё работало, а потом хоп, ну вы понимаете ... :) . На этом этапе я как раз работал с массивами, попытка всё откатить проблему не решает, перезапуск делфи тоже. Понять бы хоть как отловить место ошибки, кода много...
15 май 18, 15:58    [21411041]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24312
Андрей Игоревич,

придется отладчиком научиться пользоваться. Выход за границы массивов - вполне себе обычная практика. :)

П.С. Массивы начинаются с 0.
Андрей Игоревич
for j := 1 to 31 do
15 май 18, 16:01    [21411048]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24312
Андрей Игоревич,

придется отладчиком научиться пользоваться. Выход за границы массивов - вполне себе обычная практика. :)

П.С. Массивы начинаются с 0.
Андрей Игоревич
for j := 1 to 31 do
15 май 18, 16:01    [21411049]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10578
Память где-то портится. FastMM + FullDebug поможет найти проблему.

Я бы начал отсюда
Андрей Игоревич
 for j := 1 to BaseArr[nLine].Size do
Вы уверены, что в BaseArr[nLine] индексация с 1, а не с 0?
15 май 18, 16:02    [21411053]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 95
_Vasilisk_,wadman,

Аезде массивы начинаются с нуля, я это знаю и всегда даю им размер н+1, просто я не люблю использовать нулевой элемент, так как почти всегда за каждым расчетным элементом есть физический или графический смысл, где объекта с номером ноль не существует, ну и лень морочится разбираясь как динамический массив начинать с единицы, ну и нюансы по мелочи (хотя надо бы).
15 май 18, 16:07    [21411063]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 95
Андрей Игоревич,
Ну и почему если я вылез за границы массива доступ к форме-то отваливается :).
15 май 18, 16:08    [21411067]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 95
wadman,

В общем и правда вылез за границы массива. Но не потому, что неправильно их задал, а потому что забыл их задать :), и ведь работало до определённого момента. Хм... Спасибо.
15 май 18, 16:16    [21411077]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24312
Андрей Игоревич
Ну и почему если я вылез за границы массива доступ к форме-то отваливается :).

Массав это область памяти, форма - аналогично.
15 май 18, 16:17    [21411080]     Ответить | Цитировать Сообщить модератору
 Re: Inaccessible value, нет доступа к элементу.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10578
Андрей Игоревич
Ну и почему если я вылез за границы массива доступ к форме-то отваливается :).
Почему, если выехать на бульдозере со строительной площадки, рушится, стоящий рядом, дом?
15 май 18, 17:42    [21411332]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить