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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.11.2011, 10:05
StillRou StillRou вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 3
Репутация: 10
По умолчанию Замучила ошибка Invalid floating point operation

Здравствуйте! Пишу программу, делающую простые математические вычисления. На строке проверки условия if где берётся модуль числа Abs программа вылетает и выдаёт ошибку Project Project1.exe raised exception class EnvalidOP with message 'Invalid Floating point operation'

Вот весь код

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls;

type
mas = array of extended;
mas2 = array of integer;

  TForm1 = class(TForm)
    Button1: TButton;
    Chart1: TChart;
    Series1: TLineSeries;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  n,tau,eps,i, kol_org,j:integer;
  lymb,dt:extended;
  x:mas;
  mas_org:mas2;
begin
  n:=20000;
  dt:=1;
  lymb:=1.85;
  tau:=800;
  eps:=10;
  kol_org:=0;
  setlength(x,n+tau);

  for i:=0 to tau-1 do
    x[i]:=0.1;


  for i:=tau-1 to n+tau-2 do
    x[i+1]:=( dt*(-x[i]+lymb-x[i+1-tau]*x[i+1-tau])+eps*x[i] )/eps;


  for i:=0 to n+tau-1 do
  begin
      if  ( (x[i]>0) and (x[i+1]<0) ) or ( (x[i]<0) and (x[i+1]>0) )  then
      begin
         kol_org:=kol_org+1;
      end;
  end;


  setlength(mas_org,kol_org);
  j:=0;
  for i:=0 to n+tau-1 do
  begin
      if (((x[i]>0) and (x[i+1]<0)) or ((x[i]<0) and (x[i+1]>0))) then
      begin
         if (Abs(x[i])<Abs(x[i+1])) or (Abs(x[i])=Abs(x[i+1])) then
           mas_org[j]:=i else mas_org[j]:=i+1;

         j:=j+1
      end;
  end;

  Series1.Clear;
  for i:=0 to n+tau-1 do
    Series1.AddXY(i,x[i]);

end;

end.


В чём ошибка? Помогите пожалуйста.

Что интересно, если закомментировать условие где выдаётся ошибка
Код:
if (Abs(x[i])<Abs(x[i+1])) or (Abs(x[i])=Abs(x[i+1])) then
           mas_org[j]:=i else mas_org[j]:=i+1;

то программа всё равно выдаёт ошибку, но только на строке
Код:
Series1.AddXY(i,x[i]);
Ответить с цитированием
  #2  
Старый 13.11.2011, 11:45
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

возможно x[i] к которому ты обращаешься не существует
Ответить с цитированием
  #3  
Старый 13.11.2011, 15:58
StillRou StillRou вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 3
Репутация: 10
По умолчанию

Почему не существует? Я его в var создаю (если так можно выразиться). Я даже с ним в двух циклах for работаю. Из-за чего он может исчезнуть (если может)?

Отлаживал - наводил мышкой на массив x[i] - данные есть.
Ответить с цитированием
  #4  
Старый 13.11.2011, 21:43
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Смотрим:
Код:
setlength(x,n+tau);
...
  for i:=0 to n+tau-1 do
  begin
...
x[i+1]
как думаешь, куда указывает i+1?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 13.11.2011, 22:53
StillRou StillRou вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 3
Репутация: 10
По умолчанию

Спасибо Вам большое!

Ну какой же я невнимательный...

Ну конечно же - он указывает на элемент массива x с номеров 20800, а массив то динамический. То есть этого элемента и не существует. Их там от нуля и до 20799.

Ещё раз большое спасибо ALexandr555 и angvelem.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter