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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2013, 00:29   #1
LLIALLIJIbIK
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 51
По умолчанию Ошибка access violation

Такая вот ошибка :/ Project.exe faulted with message: 'access violation at 0x00405a0d:write of address 0x00090cc8'. Если закомментировать последний цикл, то ошибка вылетает после закрытия главной формы запущенного проекта, а с циклом вылетает сразу по нажатию на кнопку.
Код:
procedure TForm1.SpeedButton4Click(Sender: TObject);
var
i:real;
k,j:integer;
begin
Form9.Visible:=True;
for j:=1 to 5 do begin
if j=High(Mechanism) then begin
Mpp:=Mp+Mechanism[j];
break;
end
else
begin
Mpp:=Mp+Mechanism[j];
Continue;
end;
end;
Jp:=(Hpl*power(Bpl,3))/12;
if (Lp/Bp>=1) and (Lp/Bp<1.55) then
al:=2.25*(Lp/Bp)+0.05;
if Lp/Bp>=1.55 then
al:=3.55;
if Lp/Bp<1 then
al:=1;
fp:=al*sqrt((Ep*Jp)/(power(Lp,3)*Mpp));
Form9.Edit1.Text:=FloatToStr(fp);
cpr:=sqrt(Ep/Pp);
fgr:=0.6*Hpl*cpr*((1/power(Bpl,2))+(1/power(Lpl,2)));
Form9.Edit2.Text:=FloatToStr(fgr);
Me:=0.7*Mpp;
for j:=1 to 5 do begin
if (j=High(Ordinate)) and (j=High(Abscissa)) then begin
Mass[j]:=Mpp*exp(ln((1+((36*power(Ordinate[j],2))/power(Bp,2))+((36*power(Abscissa[j],2))/power(Lp,2))))*(-1/2));
break;
end
else
begin
Mass[j]:=Mpp*exp(ln((1+((36*power(Ordinate[j],2))/power(Bp,2))+((36*power(Abscissa[j],2))/power(Lp,2))))*(-1/2));
Continue;
end;
end;
for j:=1 to 5 do begin
if j=High(Mass) then begin
Form9.Memo2.Lines.Add(FloatToStr(Mass[j]));
break;
end
else
begin
Form9.Memo2.Lines.Add(FloatToStr(Mass[j]));
Continue;
end;
end;
end;
LLIALLIJIbIK вне форума Ответить с цитированием
Старый 21.04.2013, 00:34   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Вы смогли придумать самое, кхм, экстравагантное использование High.

Например:
Код:
//описать функции min и max от 2 аргументов
...
for j := max(1, Low(Mechanism)) to min(5, High(Mechanism)) do //если хотите сложить элементы из диапазона [1, 5], но не уверены, что он лежит внутри диапазона [Low, High]
  Mpp := Mpp + Mechanism[j];//сокрее всего, не Mp, а Mpp
А вообще, с таким нагромождением букв и абсолютным отсутствием форматирования найти ошибку "проблематично".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.04.2013 в 00:39.
BDA на форуме Ответить с цитированием
Старый 21.04.2013, 01:13   #3
LLIALLIJIbIK
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 51
По умолчанию

Ммм, спасибо, помогло.
LLIALLIJIbIK вне форума Ответить с цитированием
Старый 21.04.2013, 01:17   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

а чего вы прицепились к этим 1 и 5?
eval вне форума Ответить с цитированием
Старый 21.04.2013, 01:19   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

и учитесь пользоваться дебагером, первый адрес в ошибке - говорит о инструкции вызвавшей её. и не придется гадать
eval вне форума Ответить с цитированием
Старый 21.04.2013, 01:37   #6
LLIALLIJIbIK
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 51
По умолчанию

Да, надо бы. А вот теперь такая проблэма. На вот этой строке:
Код:
fp:=al*sqrt((Ep*Jp)/(power(Lp,3)*Mpp));
у меня Floating point division by zero. Значит вот эта конструкция:
Код:
for j:=max(1,Low(Mechanism)) to min(5,High(Mechanism)) do
Mpp:=Mp+Mechanism[j];
не работает. Следовательно не работает другая конструкция. Прошу оценить, уважаемые:
Код:
procedure TForm5.Button1Click(Sender: TObject);
begin
if (Edit1.Text='') or (Edit2.Text='') or (Edit3.Text='') then
ShowMessage('Введите оставшиеся параметры');
if Edit1.Text='0' then
ShowMessage('Введите значение больше нуля');
i:=1;
if not (Edit1.Text='') and not (Edit2.Text='') and not (Edit3.Text='') and not (copy(Edit1.Text,1,1)='-') and not (Edit1.Text='0') then begin
case i of
1:begin
SetLength(Mechanism,i);
SetLength(Abscissa,i);
SetLength(Ordinate,i);
SetLength(Mass,i);
Mechanism[i]:=StrToFloat(Edit1.Text);
Abscissa[i]:=StrToFloat(Edit2.Text);
Ordinate[i]:=StrToFloat(Edit3.Text);
end;
2:begin
SetLength(Mechanism,i);
SetLength(Abscissa,i);
SetLength(Ordinate,i);
SetLength(Mass,i);
Mechanism[i]:=StrToFloat(Edit1.Text);
Abscissa[i]:=StrToFloat(Edit2.Text);
Ordinate[i]:=StrToFloat(Edit3.Text);
end;
3:begin
SetLength(Mechanism,i);
SetLength(Abscissa,i);
SetLength(Ordinate,i);
SetLength(Mass,i);
Mechanism[i]:=StrToFloat(Edit1.Text);
Abscissa[i]:=StrToFloat(Edit2.Text);
Ordinate[i]:=StrToFloat(Edit3.Text);
end;
4:begin
SetLength(Mechanism,i);
SetLength(Abscissa,i);
SetLength(Ordinate,i);
SetLength(Mass,i);
Mechanism[i]:=StrToFloat(Edit1.Text);
Abscissa[i]:=StrToFloat(Edit2.Text);
Ordinate[i]:=StrToFloat(Edit3.Text);
end;
5:begin
SetLength(Mechanism,i);
SetLength(Abscissa,i);
SetLength(Ordinate,i);
SetLength(Mass,i);
Mechanism[i]:=StrToFloat(Edit1.Text);
Abscissa[i]:=StrToFloat(Edit2.Text);
Ordinate[i]:=StrToFloat(Edit3.Text);
end;
end;
if i=5 then ShowMessage('Граничное число элементов типа Механизм');
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Form5.Close;
end;
end;
LLIALLIJIbIK вне форума Ответить с цитированием
Старый 21.04.2013, 01:45   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Если бы Вам платили за количество строчек кода, то Вы бы были миллионером.
Опишите саму задачу.
Код:
procedure TForm5.Button1Click(Sender: TObject);
begin
  if (Edit1.Text='') or (Edit2.Text='') or (Edit3.Text='') then
  begin
    ShowMessage('Введите оставшиеся параметры');
    exit;
  end;
  i:=strtointdef(Edit1.Text, -1);
  if i = -1 then
  begin
    ShowMessage('Введите значение больше нуля');
    exit;
  end else if i=5 then
  begin
    ShowMessage('Граничное число элементов типа Механизм');
    exit;
  end;
  SetLength(Mechanism,i);
  SetLength(Abscissa,i);
  SetLength(Ordinate,i);
  SetLength(Mass,i);
  Mechanism[i-1]:=StrToFloat(Edit1.Text);
  Abscissa[i-1]:=StrToFloat(Edit2.Text);
  Ordinate[i-1]:=StrToFloat(Edit3.Text);
  Edit1.Text:='';
  Edit2.Text:='';
  Edit3.Text:='';
  Form5.Close;
end;
Примерные изменения кода (что-то конкретное не могу советовать, не зная, что вообще задумывалось).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 21.04.2013, 01:57   #8
LLIALLIJIbIK
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 51
По умолчанию

Конкретно в данной процедуре задача в том, чтобы по первому и каждому следующему нажатию кнопки увеличивался массив и добавлялся новый элемент. По крайней мере, так задумывалось.

Последний раз редактировалось LLIALLIJIbIK; 21.04.2013 в 02:06.
LLIALLIJIbIK вне форума Ответить с цитированием
Старый 21.04.2013, 15:53   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Тогда можно так:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  a, b, c: real;
  k: integer;
begin
  if (Edit1.Text = '') or (Edit2.Text = '') or (Edit3.Text = '') then
  begin
    ShowMessage('Введите оставшиеся параметры');
    exit;
  end;
  try
    a := StrToFloat(Edit1.Text);
    b := StrToFloat(Edit2.Text);
    c := StrToFloat(Edit3.Text);
  except
    on e: exception do
    begin
      ShowMessage('Исправьте значения в параметрах');
      exit;
    end;
  end;
  k := length(Mechanism);
  if k = -1 then
    k := 1
  else
    inc(k);
  SetLength(Mechanism, k);
  SetLength(Abscissa, k);
  SetLength(Ordinate, k);
  SetLength(Mass, k);
  Mechanism[k - 1] := a;
  Abscissa[k - 1] := b;
  Ordinate[k - 1] := c;
  Edit1.Text := '';
  Edit2.Text := '';
  Edit3.Text := '';
  Form5.Close;
end;
UPD
Пожалуйста
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.04.2013 в 15:57.
BDA на форуме Ответить с цитированием
Старый 21.04.2013, 15:56   #10
LLIALLIJIbIK
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 51
По умолчанию

Да, я приблизительно так же сделал. Главное работает. Спасибо Вам.
LLIALLIJIbIK вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка access violation at address.. Tanzor69 Помощь студентам 1 20.12.2011 21:19
Ошибка Access violation... ара Общие вопросы Delphi 2 15.05.2011 15:57
Ошибка access violation at adress Godod Помощь студентам 2 02.02.2011 11:11
ошибка access violation at address ... Yuran БД в Delphi 5 05.01.2011 16:04
Ошибка Access Violation AHTuKiLLeR Общие вопросы Delphi 8 02.06.2009 10:48