Падает прога...

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Chuck, 14 Apr 2008.

  1. Chuck

    Chuck Banned

    Joined:
    23 Jul 2007
    Messages:
    77
    Likes Received:
    180
    Reputations:
    11
    Братцы! Выручайте! .. Паскаль.. Падает прога.. Error 207: Invalid floating point operation. Очень срочно нужно исправить ошибку. В итоге должна выводиться гистограмма - это значения, превышающие или меньшие значений определяющей функции (строки 107-111)..

    Прога:

    Code:
    uses crt,graph;
    
    {#### CONFIG ####}
    
    const MAX = 10000;
    N = 10;            {#### 0<N<50 ####}
    lambda = 1;        {#### 0<lambda<50 ####}
    beta =  5;       {#### beta>lambda ####}
    DOT = 4;
    
    var Data: array [1..MAX] of real;
    Hist: array [1..N] of integer;
    
    
    {#### FUNCTION ####}
    
    function w(x:real):real;
    begin
    
    if (lambda <= x) and (x <= ((beta + lambda)/2)) then
    w:= 4*(x-lambda)/sqr((beta - lambda));
    
    if ((beta + lambda)/2 <= x) and (x <= beta) then
    w:= 4*(beta - x)/sqr((beta - lambda));
    
    end;
    
    
    
    {#### PROCEDURE ####}
    
    procedure DrawHist;
    var i:integer;
    	 step:real;
    	 Max_Num:integer;
    	 s:string;
    	 k:real;
    	 m1:real;
    	 D:real;
    	 hi:real;
    	 wk:real;
    begin
    for i:=1 to N do Hist[i]:=0;{clearing array}
    
    {#### CALCULATE HIST ####}
    
    step:=lambda/N;
    for i:=1 to MAX do inc(Hist[1+trunc((Data[i]-beta+lambda/2)/step)]);
    
    {#### LOOK FOR Max_Num ####}
    
    Max_Num:=0;
    for i:=1 to N do if Max_Num<Hist[i] then Max_Num:=Hist[i];
    
    {#### DRAWHIST ####}
    
    m1:=0;D:=0;hi:=0;
    for i:=0 to N-1 do begin
    		  SetColor(14);
    		  rectangle(
    						round(i*GetMaxX/N),
    						round(2*GetMaxY/3),
    						round((i+1)*GetMaxX/N),
    						round(2*GetMaxY/3*(1-Hist[i+1]/Max_Num)));
    		  str(Hist[i+1],s);
    		  SetColor(3);
    		  SetTextStyle(DefaultFont, VertDir, 1);
    		  OutTextXY(round(i*GetMaxX/N)+GetMaxX div N,
    						round(2*GetMaxY/3)-40,s);
    		  str((i+1)*step+beta-lambda/2:1:1,s);
    		  SetColor(4);
    		  OutTextXY(round(i*GetMaxX/N)+GetMaxX div N,
    						round(2*GetMaxY/3)+10,s);
    		  m1:=m1+((i+1)*step+beta-lambda/2)*Hist[i+1]/Max;
    		  D:=D+sqr(((i+1)*step+beta-lambda/2))*Hist[i+1]/Max;
    		  wk:=0.5*sqrt(2)*
    				(sin(((i+1)*step+beta-lambda/2)*PI/2/lambda)*cos(PI*beta/2/lambda)
    				-cos(((i+1)*step+beta-lambda/2)*PI/2/lambda)*sin(PI*beta/2/lambda)
    				-sin((i*step+beta-lambda/2)*PI/2/lambda)*cos(PI*beta/2/lambda)
    				+cos((i*step+beta-lambda/2)*PI/2/lambda)*sin(PI*beta/2/lambda));
    		  hi:=hi+MAX*sqr(Hist[i+1]/MAX-wk)/wk;
    		 end;
    SetTextStyle(DefaultFont,HorizDir,1);
    SetColor(9);
    str(m1:0:DOT,s);
    OutTextXY(100,2*GetMaxY div 3 +70,'m1(prakt)= '+s);
    str(beta:0:DOT,s);
    OutTextXY(100,2*GetMaxY div 3 +90,'m1(teor) = '+s);
    D:=D-m1*m1;
    str(D:0:DOT,s);
    OutTextXY(250,2*GetMaxY div 3 +70,'D(prakt)= '+s);
    D:=(PI*PI-32+8*PI)*lambda*lambda/4/PI/PI;
    str(D:0:DOT,s);
    OutTextXY(250,2*GetMaxY div 3 +90,'D(teor) = '+s);
    str(hi:0:DOT,s);
    OutTextXY(400,2*GetMaxY div 3 +80,'hi2 ='+s);
    k:=-100000;
    for i:=0 to GetMaxX do
    			 if w(i*lambda/GetMaxX-lambda/2+beta)>k then k:=w(i*lambda/GetMaxX-lambda/2+beta);
    
    SetTextStyle(DefaultFont, HorizDir, 1);
    MoveTo(0,round(2*GetMaxY/3*(1-w(-lambda/2+beta)/k)));
    SetColor(4);
    for i:=0 to GetMaxX do begin
    		LineTo(i,round(2*GetMaxY/3*(1-w(i*lambda/GetMaxX-lambda/2+beta)/k)));
    	 end;
    end;
    
    
    
    {#### REV FUNCTION ####}
    
    function F_Rev(x:real):real;
    begin
    
    if (lambda <= x) and (x <= ((beta + lambda)/2)) then
    F_Rev:= 2*sqr((x-lambda))/sqr((beta - lambda));
    
    if ((beta + lambda)/2 <= x) and (x <= beta) then
    F_Rev:= 1 - 2*sqr((beta - x))/sqr((beta - lambda));
    end;
    
    
    
    {#### GENERATE AND FULL ARRAY #### }
    
    
    
    procedure GenerateData;
    var y:real;
    	 i:integer;
    begin
    SetFillStyle(0,0);
    OutTextXY(0,0,'Generating...');
     for i:=1 to MAX do begin
    	y:=random;
    	Data[i]:=F_Rev(y);
    	end;
    Bar(0,0,GetMaxX,GetMaxY);
    end;
    
    
    {#### FIND DRIVERS ####}
    
    
    procedure OpenGraph;
     var Gd, Gm: Integer;
    begin
    
     Gd := Detect;
     InitGraph(Gd, Gm, 'c:\tp\bgi');
    end;
    
    
    
    {#### OUT ####}
    begin
    ClrScr;
    Randomize;
    {GetParams;}
    OpenGraph;
    repeat
     GenerateData;
     DrawHist;
     delay(500);
    until keypressed;
    CloseGraph;
    WriteLn('Good!');
    end.
    
     
    #1 Chuck, 14 Apr 2008
    Last edited: 15 Apr 2008
    5 people like this.
  2. LEE_ROY

    LEE_ROY Elder - Старейшина

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    нет паскаля, в делфе нету юнитов нужных , в отладчик смотрел?
     
  3. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,362
    Likes Received:
    1,157
    Reputations:
    430
    http://forum.vingrad.ru/forum/s/6bec7e1f871e9fa05c83226fc6ea4d1b/topic-194088/anchor-entry1399234/0.html
    Может...
     
  4. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    _http://forum.saratov.ru/lofiversion/index.php/t1699.html
    _http://subscribe.ru/archive/comp.soft.prog.pasplus/200611/07183040.html
    Dr.Check, я показал, что означает эта ошибка!
    ------
    Я пытался помочь человеку!
    А ты ставишь минусы за помощь?!

    -----
     
    #4 De-visible, 15 Apr 2008
    Last edited: 15 Apr 2008
    2 people like this.
  5. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,362
    Likes Received:
    1,157
    Reputations:
    430
    2 De-visible
    ppc... тебя не спрашивали описания кодов ошибок... спросили как её исправить...
    глупость пишешь...
     
  6. Hellsp@wn

    Hellsp@wn Elder - Старейшина

    Joined:
    29 Apr 2007
    Messages:
    400
    Likes Received:
    153
    Reputations:
    48
    возможно переполняется какая-то из переменных, ща нет времеени смотреть,можешь скомпилить 32-ух битный ехе с дебаг инфо?
     
    1 person likes this.
  7. Chuck

    Chuck Banned

    Joined:
    23 Jul 2007
    Messages:
    77
    Likes Received:
    180
    Reputations:
    11
    Уфф.. Dr.Check, вот так: махнул все real на extended.. Ничего..

    Второй момент: после смены типов компилятор начал дико тупить: стал выделять :DOT, подчёркивать запятые...

    Hellsp@wn, Рандж чека не было..


    Всё ещё актуальна проблема.. :(
     
    #7 Chuck, 15 Apr 2008
    Last edited: 15 Apr 2008
  8. Chuck

    Chuck Banned

    Joined:
    23 Jul 2007
    Messages:
    77
    Likes Received:
    180
    Reputations:
    11
    Давайте так: кто сделает стабильно рабочую прогу, с нормальной диаграммой, тому торжественно вручу шестизнак. Срок действия до 13.00.
     
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Чтото тут с формулой не то, потому что в отладчике после
    for i:=1 to MAX do inc(Hist[1+trunc((Data-beta+lambda/2)/step)]);
    массиd Hist всё равно содержал нулевые элементы
    и по этому после for i:=1 to N do if Max_Num<Hist then Max_Num:=Hist;
    Max_Num было = 0;
    и в конечном счете в строке
    rectangle(
    round(i*GetMaxX/N),
    round(2*GetMaxY/3),
    round((i+1)*GetMaxX/N),
    round(2*GetMaxY/3*(1-Hist[i+1]/Max_Num)));
    вылетала ошибка при делении на 0. но почему-то код ошибки был левый.
     
    1 person likes this.