Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2011, 00:49   #1
Diplomnik
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 13
По умолчанию Инициализация дин. массивов Delphi

Здравствуйте, вопрос такой. Имеется вспомогательный модуль. Одна и та же процедура, запущенная из него, в одном случае работает нормально, в другом - вылетает с ошибкой "acces violation бла-бла-бла". Cуть в том, что в этой процедуре используется дин. массив. Причем, в первом (рабочем) случае, он, как и положено, инициализируется с длиной = 0, в другом по каким-то магическим причинам, он переполнен (длина 141) и забит всякой ересью. SetLength не работает - вылетает всё с той же ошибкой.

Помогите, у меня защита через 2 недели =(
Diplomnik вне форума Ответить с цитированием
Старый 25.01.2011, 03:08   #2
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

код продцедуры и ее вызова в студию, а если это еще и не чистая (ее работы не зависит от внешних факторов) продцедура, то тогда все в студию =)
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 25.01.2011, 11:21   #3
Diplomnik
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 13
По умолчанию

Код:
unit EquationResolve;

interface
type Eq = TObject;

equation = object
Exp:array [0..1] of string;
InX, InY, InZ:integer;
Ua:array of double;
Xanswer,Yanswer,Zanswer:array of extended;
........
implementation
uses dialogs, SysUtils, Classes, Math, ExpressionResolve;
//----------------//
procedure equation.ResolvePOS(S:array of string; U,L,R:array of extended; E:array of double);
var i,k,j,test:integer;
Stemp:string;
SysStrings:array of string;
precision:double;
begin
i:=Length(U);
SetLength(Ua,i);
i:=0;
  repeat
//-----x
      if copy(S[i],9,1)='у' then
        begin
          Stemp:=s[i]+' '+s[i+1]+' '+s[i+2];
          Stemp:=GetEquation(Stemp,U);
          Stemp:=StringReplace(Stemp,',','.',[rfReplaceAll, rfIgnoreCase]);
          Resolve1(Stemp,L[InX],R[InX],10000,E[InX]);
          if Length(Xanswer)>0 then
           U[InX]:=Xanswer[0]
          else
           U[InX]:=1.123456789;
          i:=i+2;
          Finalize(Xanswer);
        end;
//-----x,y
      if copy(S[i],8,1)='с' then
        begin
          Exp[0]:='';
          Exp[1]:='';
          k:=i+1;
           repeat
             k:=k+1;
           until copy(S[k],1,1)<>'u';
          SetLength(SysStrings,k-i+1);
            for j:=0 to k-i do SysStrings[j]:=S[i+j];
            for j:=0 to k-i-1 do
          GetSystem(SysStrings,U);

          if k-1-i=2 then
            begin
              precision:=min(E[InX],E[InY]);
              Resolve2(Exp[0],Exp[1],L[inX],R[iny],R[inx]-L[inx],R[iny]-L[iny],precision);
            end;

          if Length(Yanswer)>0 then
            begin
              U[inX]:=Xanswer[0];
              U[inY]:=Yanswer[0];
            end
           else
            begin
             U[inX]:=1.123456789;
             U[inY]:=1.123456789;
            end;
        end;
        Finalize(Xanswer);
        Finalize(Yanswer);
  i:=i+1;
  until i>=Length(S);

  for i:=1 to (Length(U)-1) do
  Ua[i]:=U[i];
  Finalize(L);
  Finalize(R);
  Finalize(E);

end;
Вот эта процедура.

Но, как всегда бывает, сейчас включил компьютер - и всё работает... Ничего не понимаю %)
Diplomnik вне форума Ответить с цитированием
Старый 25.01.2011, 11:27   #4
Diplomnik
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 13
По умолчанию

Здесь массив оказывается (-лся) захламленным.

Код:
procedure Resolving;
var res:Equation;
    k:integer;
begin
    Res.ResolvePOS(Equations,U,L,R,Eps);
      for k:=1 to Length(U)-1 do
        U[k]:=res.Ua[k];
end;


А вот тут всё нормально. Хотя разницы я не вижу.

Код:
...
 if Checker=true then
         begin
assignfile(TempF,'DATA\'+FRMVvodaIshodDannih.combobox1.Text+'\chisl.txt');
          reset(TempF);
            repeat
              readln(TempF,TempString);
              if tempString='' then goto 1;
      TempString:=StringReplace(TempString,'.',',',[rfReplaceAll,rfIgnoreCase]);
              InIndex:=getInIdex(tempString);
              U[InIndex]:=getInValue(tempString);
              1:
            until tempString='';
          closeFile(TempF);
         end;
//-----------Решаем систему-----------//
    Resolve.ResolvePOS(Equations,U,L,R,Eps);
    NumbericResults.Memo1.Lines.Clear;
...
Diplomnik вне форума Ответить с цитированием
Старый 25.01.2011, 11:33   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
 goto 1;


воистину, "Опытный программист на Фортране сумеет создать фортрановскую программу на любом языке".


По теме: в первом случае res — это у вас объект, который указывает в никуда, соответствено SetLength(Ua,i);, где Ua — поле неиницализированного объекта, может приводить к любым результатам.

Подозреваю, что объекту Resolve во втором случае повезло больше.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 25.01.2011 в 11:46.
veniside вне форума Ответить с цитированием
Старый 26.01.2011, 00:03   #6
Diplomnik
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 13
По умолчанию

Почему в никуда? Просто таким тупым (по другому не умею) способом вызывается процедура из другого unit'a. В этом юните есть массив Ua, (принадлежащий объекту equation) который инициализируется в начале процедуры. Resolve и Res - оба объекта создаются абсолютно одинаково, разница лишь в названии.

В случае с объектом Resolve - всё клёво и сказочно. А вот в случае со вторым - беда. Была по крайней мере, после ребута компа почему-то проблема исчезла... Не хотелось бы чтобы вылезло всё это в неподходящий момент %)
Diplomnik вне форума Ответить с цитированием
Старый 26.01.2011, 00:56   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

В никуда потому, что res — это указатель. Т.к. он хранится на стеке, то и подхватывает с него любой мусор в качестве указателя. Чтобы он указывал на область памяти, выделенную под экземпляр вашего класса, его нужно создать:

Код:
res := Equation.create();
Только после этого можно вызывать у res какие-то методы. И удалить не забудьте, когда объект больше не нужен:

Код:
res.Free();
Ровно то же самое относится и к Resolve.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.01.2011, 08:56   #8
Diplomnik
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 13
По умолчанию

Хм... Спасибо) Я так понимаю, нужно написать конструктор и деструктор для Equation, правильно?
Diplomnik вне форума Ответить с цитированием
Старый 27.01.2011, 11:32   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

нет, контструктор и деструктор уже написаны в TObject, от которого наследуются все классы в Дельфи. Нужно не забывать их вызвать.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слияние двух массивов в Delphi sauron99 Помощь студентам 17 03.04.2016 09:37
Обработка символьных массивов в delphi Manya-srt Помощь студентам 0 09.11.2010 16:23
Обработка двумерных массивов (матриц) в Delphi Ulena Помощь студентам 1 31.03.2010 09:35
Delphi передача динамических массивов world12_tk Помощь студентам 7 23.12.2009 21:06
Инициализация массивов в конструкторе. jojahti Общие вопросы C/C++ 7 27.07.2009 13:30