Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перенос исходников из TP в Delphi, Что-то не получается. 
:(
    Опции темы
Unregistered
Дата 21.8.2003, 04:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В том то и дело я не знаю где именно рождается ошибка. Могу сравнить только конечные результаты.
Видать прийдется ковыряться покрупной ;))) Исходники все на другом компе, дорваться не могу, завтра с утра продолжу, тогда может какой-нибудь кусок, самый подозрительный, закину сюда.
  Вверх
Vit
Дата 21.8.2003, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Закинь прямо сюда, ковыряться конечно никто не будет, но можно будет пробежать свежим взглядом, может прийдут мысли о подозрительных местах...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Unregistered
Дата 21.8.2003, 10:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот почти все где могут быть ошибки. Или даже все.

Код

const
nfx :byte = 4;
type
   pyt = ^yt;
   yt = record
        y, t :double;
        py :pyt
        end;
   arrayb = array[1..24] of byte;
   arrayd = array[1..24] of double;
   sply = ^spoly;
   spoly = record s :string; p :sply end;
   end;
 
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   BitBtn1: TBitBtn;
   procedure BitBtn1Click(Sender: TObject);
 
  procedure polrtt(na :byte; a :arrayd; var qr, qi :arrayd;
            var nr, nrr :byte; var krat :arrayb; var ier :byte);
   procedure tabfreq(Sender: TObject);
   procedure rooterr;
   function atan2(x, y :double) :double;
   function fixn(x :double; n :integer) :string;
   procedure FormActivate(Sender: TObject);

  ...

 end;

var
 Form1: TForm1;

   ptr :^integer;
   py0, pyi, pyw :pyt;
   ch :string;
   vx, frm :string;
   fl, qstab, qstart, equiv, grid :boolean;
   key :word;
   xc, yc, xc1, yc1, xm,
   jj, l, m, nb, n, nr, nrr, nd, ier, nright,
   na, ncx, mnu :byte;
   i, j, code :integer;
   c, cx, b0, b, a0, a, gd, dc, dr, qr, qi :arrayd;
   kr :arrayb;
//string было str16,вроде в этих функциях оно всеравно не используется
implementation

{$R *.dfm}

procedure TForm1.tabfreq(Sender: TObject); //Эта функция все и выдает
   const eps = 1.0e-40;
   var
     jj:byte;
     i, j, y, js :word;
     w0, w1, dw, w, am, p, x :double;
     code, count :integer;
     s :string[32];
     nrb, nrrb :byte;
     qrb, qib :arrayd;
     krb :arrayb;
     rdk :char;
     tr,td:Integer;
   begin
////////Начальные значения/////////////
     vx := '1(t)';
     tconst := 1;
     ncx := 2;
     cx[1] := 1; cx[2] := -0.5; cx[3] := 0.2;
     //xlo := 10; ylo := 10; xhi := 90; yhi := 90;
     //equiv := false; grid := false;
     n := 5;
     a0[1] := 1; a0[2] := 2; a0[3] := 3; a0[4]:=4; a0[5]:=5; a0[6]:=6;
     m := 0;
     b0[1] := 1;// b0[2] := 2;// b0[3] := 3; b0[4]:=4;
   ///------------
   w0:=1;  // нач частота
           
   w1:=10; // кон частота
   dw:=1;  // шаг
   td:=0;
   tr:=td;
   
  begin
   polrtt(n, a0, qr, qi, nr, nrr, kr, ier);
   rooterr; //выдает ошибки типа отсутствия корней.
   if (ier > 0) and (ier < 5) then exit;
   if m > 0 then
     begin
     polrtt(m, b0, qrb, qib, nrb, nrrb, krb, ier);
     rooterr;
     if (ier > 0) and (ier < 5) then exit
     end;
   j := 0;

    repeat
     w := w0 + j*dw;
     inc(j);
     count := 0;
     am := abs(b0[m+1]/a0[n+1]);
     p := 0;
     if b0[m+1]*a0[n+1] < 0.0 then
       p := p - pi;
     if m > 0 then
       begin
       for i := 1 to nrrb do
         for jj := 1 to krb[i] do
           begin
           am := am*sqrt(sqr(qrb[i]) + sqr(w));
           p := p + atan2(-qrb[i], w)
           end;
       i := nrrb + 1;
       while i <= nrb do
         begin
         for jj := 1 to krb[i] do
           begin
           x := sqr(sqr(qrb[i]) + sqr(qib[i]) + sqr(w)) -
             sqr(2*qib[i]*w);
           if x < eps then inc(count)
           else am := am*sqrt(x);
           p := p + atan2(sqr(qrb[i]) + sqr(qib[i]) - sqr(w),
             -2*qrb[i]*w)
           end;
         inc(i)
         end
       end;
     for i := 1 to nrr do
       for jj := 1 to kr[i] do
         begin
         am := am/sqrt(sqr(qr[i]) + sqr(w));
         p := p - atan2(-qr[i], w)
         end;
     i := nrr + 1;
     while i <= nr do
       begin
       for jj := 1 to kr[i] do//kr[i]
         begin
         x := sqr(sqr(qr[i]) + sqr(qi[i]) + sqr(w)) -
           sqr(2*qi[i]*w);
         if x < eps then dec(count)
         else am := am/sqrt(x);
         p := p - atan2(sqr(qr[i]) + sqr(qi[i]) - sqr(w),
           -2*qr[i]*w)
         end;
       inc(i)
       end;
     if count > 0 then am := 0;
     if count = 0 then
       begin
       StringGrid1.Cells[td,tr]:=fixn(w, nfx);
       StringGrid1.Cells[td+1,tr]:=fixn(am, nfx);
       StringGrid1.Cells[td+2,tr]:=fixn(20*ln(am)/ln(10.0), nfx);
       StringGrid1.Cells[td+3,tr]:=fixn(p*180.0/pi, nfx);
// А вот так выглядел вывод раньше.
//          writeln(fixn(w, nfx):16, fixn(am, nfx):16,
//            fixn(20*ln(am)/ln(10.0), nfx):16,
//            fixn(p*180.0/pi, nfx):16);
//          writeln(fq, fixn(w, nfx):16, fixn(am, nfx):16,
//            fixn(20*ln(am)/ln(10.0), nfx):16,
//            fixn(p*180.0/pi, nfx):16)
      inc(tr);
      StringGrid1.RowCount:=tr;
       end
     else
       if count > 0 then
         begin
//          writeln(fixn(w, nfx):16, fixn(am, nfx):16,
//            '- тьма':16, fixn(p*180.0/pi, nfx):16);
//          writeln(fq, fixn(w, nfx):16, fixn(am, nfx):16,
//            '- тьма':16, fixn(p*180.0/pi, nfx):16)
         end
       else
         begin
//          writeln(fixn(w, nfx):16,'Резонанс':24);
//          writeln(fq,fixn(w, nfx):16,'Резонанс':24)
         end;

   until (w >= w1) or (rdk = #27);
   end
   end;      {----- tabfreq -----}

//------Procedure--------polrtt-----------------
procedure TForm1.polrtt(na :byte; a :arrayd; var qr, qi :arrayd;
   var nr, nrr :byte; var krat :arrayb; var ier :byte);
   const
     eps = 5.0e-7;
   var
     i, j, n, nt, nre, nc, n0, ii, jj, kr :byte;
     ind :shortint;
     d, x, y, temp :double;
     r, t :arrayd;

   procedure factor (n :byte; var a,r,t :arrayd; var nt :byte);
     var
       r1, t1, aa :arrayd;
       temp, er, ar :double;
       i, j, nr, nr1, ni, nt1 :byte;
     label mtk;
     begin
     ar := 0.0;
     for i := 1 to n - 1 do
       ar := ar + sqr(a[i]);
     ar := sqrt(ar/(n-1));
     for i := 1 to n + 1 do
       begin
       r[i] := a[i];
       if i > 1 then
         r1[i-1] := (i-1) * a[i]
       end;
     nr := n;
     nr1 := n - 1;
     for i := 1 to n + 1 do
       begin
       if i = 1 then t[i] := 1.0
       else t[i] := 0.0;
       t1[i] := 0.0
       end;
     nt := 0;
     repeat
       for i := 0 to nr - nr1 do
         begin
         ni := nr + 1 - i;
         r[ni] := r[ni] / r1[nr1 + 1];
         for j := 0 to nr1 - 1 do
           r[ni-nr1+j] := r[ni-nr1+j] - r[ni] * r1[j+1]
         end;
       for i := 1 to nr - nr1 + 1 do
         for j := 1 to nt + 1 do
           t1[i+j-1] := t1[i+j-1] + r[nr1+i] * t[j];
       nt1 := nr - nr1 + nt;
       for i := 1  to n + 1 do aa[i] := 0.0;
       for i := 1 to nr1 + 1 do
         for j := 1 to nt1 + 1 do
           aa[i+j-1] := aa[i+j-1] + r1[i] * t1[j];
       for i := 1 to nt1 + 1 do
         begin
         temp := t1[i];
         t1[i] := t[i];
         t[i] := temp
         end;
       nt := nt1;
       for i := 1 to nr1 + 1 do
         begin
         temp := r[i];
         r[i] := r1[i];
         r1[i] := temp
         end;
       nr := nr1;
       dec(nr1);
       while abs(r1[nr1 + 1]/ar) < eps do
         begin
         if nr1 = 0 then goto mtk;
         dec(nr1)
         end;
       mtk:
       er := 0.0;
       for i := 1 to n - 1 do
         er := er + sqr(a[i] - aa[i]);
       er := sqrt(er / (n - 2))/ar;
     until (er <= eps) or (nr1 = 0);
     if (nr1 = 0) and (er > eps) then
       begin
       r[1] := 1.0;
       nt := n;
       for i := 1 to n + 1 do t[i] := a[i]
       end;
     end;    {----- factor -----}

   procedure sturm (nt :byte; t :arrayd; var nr :byte);
     var
       p, s :arrayd;
       temp, w :double;
       i, j, ni, nleft, nright, np, ns :byte;
       l1, l2, r1, r2 : boolean;
     label mtk;
     begin
     nleft := 0;
     nright := 0;
     w := 0;
     for i := 1 to nt + 1 do
       begin
       p[i] := t[i] / t[nt+1];
       w := w + sqr(p[i]);
       if i > 1 then s[i-1] := (i - 1) * p[i] / nt
       end;
     w := sqrt(w/(nt+1));
     np := nt;
     ns := nt - 1;
     r1 := (p[np+1] > 0);
     l1 := not(r1 xor ((np mod 2) = 0));
     r2 := (s[ns+1] > 0);
     l2 := not(r2 xor ((ns mod 2) = 0));
     if r1 xor r2 then nright := nright + 1;
     if l1 xor l2 then nleft  := nleft  + 1;
     repeat
       for i := 0 to np - ns do
         begin
         ni := np + 1 - i;
         p[ni] := p[ni] / s[ns+1];
         for j := 0 to ns - 1 do
           p[ni-ns+j] := p[ni-ns+j] - p[ni] * s[j+1]
         end;
       for i := 1 to ns + 1 do
         begin
         temp := p[i];
         p[i] := s[i];
         s[i] := temp
         end;
       np := ns;
       dec(ns);
       while abs(s[ns+1]/w) < eps do
         begin
         if ns = 0 then goto mtk;
         dec(ns)
         end;
       mtk:
       w := 0;
       for i := 1 to ns + 1 do
         begin
         s[i] := -s[i] / abs(s[ns+1]);
         w := w + sqr(s[i])
         end;
       w := sqrt(w/(ns+1));
       l1 := l2;
       r1 := r2;
       r2 := s[ns+1] > 0;
       l2 := not (r2 xor ((ns mod 2) = 0));
       if l1 xor l2 then nleft  := nleft  + 1;
       if r1 xor r2 then nright := nright + 1;
     until ns <= 0;
     nr := nleft - nright
     end;    {----- sturm -----}

   procedure newrea(n :byte; t :arrayd; var x :double);
     var
       f, temp, xl, xr, dx :double;
       kit, i, j :integer;
     begin
     xl := 0.0; xr := 0.0;
     for i := 2 to n + 1 do
       if abs(t[i]) > xl then xl := abs(t[i]);
     xl := 1.0 / (1.0 + xl / abs( t[1] ));
     for i := 1 to n do
       if abs(t[i]) > xr then xr := abs(t[i]);
     xr := 1.0 + xr / abs(t[n+1]);
     dx := 0.25 * (xr - xl);
     x := xl;
     kit := 0;  j := 0;
     repeat
       inc(kit);
       if kit >= 200 then
         begin
         inc(j);
         if j = 10 then begin ier := 1; exit end;
         kit := 0;
         xl := -xl;
         if xl > 0.0 then xl := xl + dx;
         x := xl
         end;
       f := t[n+1];
       for i := n downto 1 do f := f * x + t[i];
       if n > 1 then
         begin
         temp := n * t[n+1];
         for i := n downto 2 do
           temp := temp * x + (i - 1) * t[i]
         end
       else temp := t[2];
       x := x - f / temp;
     until abs(f / temp / x) < eps;
     end;    {----- newrea -----}

   procedure newcom(n :byte; t :arrayd; var x, y :double);
     var
       u, v, ux, vx, dx, dy, temp, xl, xr, dxl :double;
       kit, i, j :integer;
     begin
     xl := 0.0; xr := 0.0;
     for i := 2 to n + 1 do
       if abs(t[i]) > xl then xl := abs(t[i]);
     xl := 1.0 / (1.0 + xl / abs( t[1] ))/sqrt(2.0);
     for i := 1 to n do
       if abs(t[i]) > xr then xr := abs(t[i]);
     xr := (1.0 + xr / abs(t[n+1]))/sqrt(2.0);
     dxl := 0.25 * (xr - xl);
     x := xl; y := xl;
     kit := 0;  j := 0;
     repeat
       inc(kit);
       if kit >= 200 then
         begin
         inc(j);
         if j = 10 then begin ier := 1; exit end;
         kit := 0;
         xl := -xl;
         if xl > 0.0 then xl := xl + dxl;
         x := xl;  y := -xl
         end;
       u := t[n+1];
       v := 0.0;
       for i := n downto 1 do
         begin
         temp := x * v + y * u;
         u := x * u - y * v + t[i];
         v := temp
         end;
       ux := n * t[n+1];
       vx := 0.0;
       for i := n downto 2 do
         begin
         temp := x * vx + y * ux;
         ux := x * ux - y * vx + (i - 1) * t[i];
         vx := temp
         end;
       temp := sqr(ux)+sqr(vx);
       dx := (u * ux + v * vx) / temp;
       dy := (v * ux - u * vx) / temp;
       x := x - dx;
       y := y - dy;
     until (abs(dx) + abs(dy)) / (abs(x) + abs(y)) < eps;
     end;  {----- newcom -----}

   procedure residu(nr :byte; r :arrayd;
                    r0, x0, y0 :double; var kr :byte);

     function sign(a :double) :double;
       begin
       if a >= 0 then sign := 1.0 else sign := -1.0
       end;

     var
       phi, phip, dphi, darg, x, y, u, v, t :double;
       i, j :integer;
     begin
     dphi := 2 * pi / nr / 16;
     darg := 0.0;
     for i := 0 to nr * 16 do
       begin
       x := x0 + r0 * cos(dphi * i);
       y := y0 + r0 * sin(dphi * i);
       u := r[nr+1];
       v := 0;
       for j := nr downto 1 do
         begin
         t := x * v + u * y;
         u := x * u - y * v + r[j];
         v := t
         end;
       if u = 0.0 then phi := sign(v) * pi / 2.0
       else if u > 0.0 then phi := arctan (v / u)
       else if y <> 0.0 then
         phi := arctan (v / u) + sign(v) * pi
       else phi := pi;
       if i = 0 then phip := phi
       else
         begin
         if ((abs(phi) > pi/2.0) or (abs(phip) > pi/2.0))
           and (sign(phi) <> sign(phip)) then
           begin
           if sign(phi) > 0.0 then t := phi - phip - 2.0 * pi
           else t := phi - phip + 2.0 * pi;
           end
         else t := phi - phip;
         darg := darg + t;
         phip := phi
         end
       end;
     kr := round (darg / (2.0 * pi))
     end;    {----- residu -----}

   begin     {----- polrtt -----}
   ier := 0;
   if (na <= 0) or (na > 23) then
     begin
     ier := 2;
     exit
     end;
   if a[na+1] = 0.0 then
     begin
     ier := 3;
     exit
     end;
   n := na;
   { отделение нулевых корней }
   nr := 0;
   nrr := 0;
   krat[1] := 0;
   while (a[1] = 0.0) and (n > 0) do
     begin
     krat[1] := krat[1] + 1;
     n := n - 1;
     for i := 1 to n+1 do a[i] := a[i+1];
     end;
   if krat[1] <> 0 then
     begin
     inc(nr);
     inc(nrr);
     qr[nr] := 0.0;
     qi[nr] := 0.0
     end;
   if n = 0 then exit;
   if n = 1 then
     begin
     inc(nr);
     inc(nrr);
     qr[nr] := -a[1] / a[2];
     qi[nr] := 0.0;
     krat[nr] := 1;
     exit
     end;
   if n = 2 then
     begin
     d := sqr(a[2])-4.0*a[1]*a[3];
     if abs(d/(sqr(a[1])+sqr(a[2])+sqr(a[3])))
       < sqr(eps) then d := 0;
     if d = 0 then
       begin
       inc(nr);
       inc(nrr);
       qr[nr] := -0.5 * a[2] / a[3];
       qi[nr] := 0;
       krat[nr] := 2;
       exit
       end;
     if d < 0 then
       begin
       inc(nr);
       qr[nr] := -0.5 * a[2] / a[3];
       qi[nr] := 0.5 * sqrt( -d ) / a[3];
       krat[nr] := 1;
       inc(nr);
       qr[nr] := qr[nr-1];
       qi[nr] := -qi[nr-1];
       krat[nr] := 1
       end
     else
       begin
       if a[2] < 0.0 then d := -0.5 * (a[2] - sqrt(d))
       else d := -0.5 * (a[2] + sqrt(d));
       inc(nr);
       qr[nr] := d / a[3];
       qi[nr] := 0.0;
       krat[nr] := 1;
       inc(nr);
       qr[nr] := a[1] / d;
       qi[nr] := 0.0;
       krat[nr] := 1;
       inc(nrr,2);
       end;
     exit
     end;
   { Факторизацмя полинома  А = R * Т
   *******   R -- н.о.д. А и А'
   *******   T -- полином с простыми корнями }
   factor (n, a, r, t, nt);
   if nt = 1 then
     begin
     inc(nr);
     inc(nrr);
     qr[nr] := -t[1] / t[2];
     qi[nr] := 0.0;
     krat[nr] := n;
     exit
     end;
   { Вычисление числа действительных корней }
   sturm (nt, t, nre);
   inc(nrr, nre);
   { Вычисление действительных корней  }
   if nre > 0 then
     for i := 1 to nre do
       begin
       newrea(nt + 1 - i, t, x);
       if ier = 1 then exit;
       nr := nr + 1;
       qr[nr] := x;
       qi[nr] := 0.0;
       krat[nr] := 1;
       { Исключение вычисленного корня }
       for j := nt + 1 - i downto 2 do
         t[j] := t[j] + x * t[j+1];
       for j := 1 to nt + 1 - i do t[j] := t[j+1]
       end;
   { Вычисление комплексных корней }
   nc := (nt - nre) div 2;
   if nc > 0 then
     for i := 1 to nc do
       begin
       newcom(2 * (nc+1-i), t, x, y);
       if ier = 1 then exit;
       for j := nr + 1 to nr + 2 do
         begin
         qr[j] := x;
         qi[j] := abs(y);
         krat[j] := 1
         end;
       nr := nr + 2;
       qi[nr] := -qi[nr];
       { Исключение вычисленного корня }
       temp := sqr(x) + sqr(y);
       t[2*(nc+1-i)] := t[2*(nc+1-i)] + 2*x*t[2*(nc-i)+3];
       for j := 2 * (nc - i) + 1 downto 3 do
         t[j] := t[j] + 2 * x * t[j+1] - temp * t[j+2];
       for j := 1 to 2 * (nc - i) + 1 do
         t[j] := t[j+2];
       end;
   d := 0;
   for i := 1 to nr do
     d := d + sqrt(sqr(qr[i]) + sqr(qi[i]));
   d := d/nr;
   for i := 1 to nr do
     begin
     if abs(qr[i])/d < eps then qr[i] := 0;
     if abs(qi[i])/d < eps then qi[i] := 0;
     end;
   { Вычисление кратности корня }
   if nt < n then
     begin
     n0 := 0;
     if (qr[1] = 0.0) and (qi[1] = 0.0) then n0:=1;
     for i := 1 to nre + nc do
       begin
       { Вычисление мин. расстояния }
       if i <= nre then ii := n0 + i
       else ii := n0 + 2 * i - nre - 1;
       ind := -1;
       for jj := n0 + 1 to n0 + nre + 2*nc do
         if jj <> ii then
           begin
           if ind < 0 then
             begin
             y := sqr(qr[ii] - qr[jj]);
             temp := y + sqr(qi[ii] - qi[jj]);
             ind := 1;
             end
           else
             begin
             y := sqr(qr[ii] - qr[jj]);
             if temp > y + sqr(qi[ii] - qi[jj]) then
               temp := y + sqr(qi[ii] - qi[jj]);
             end;
           end;
       { Радиус окружности вокруг очередного корня }
       temp := 0.5 * sqrt(temp);
       x := qr[ii];
       y := qi[ii];
       residu (n - nt, r, temp, x, y, kr);
       if kr > 0 then
         begin
         if i <= nre then krat[ii] := krat[ii] + kr
         else
           begin
           krat[ii]  := krat[ii] + kr;
           krat[ii+1] := krat[ii+1] + kr;
           end
         end;
       end; { for }
     end; { if }
   j := 0;
   for i := 1 to nr do j := j + krat[i];
   if j <> na then ier := 4;
   end;      {----- polrtt -----}
//---End---of----polrtt-----------

        {----rooterr----}
procedure TForm1.rooterr;
   //var
   //i:Integer;
   begin
   if (ier > 0) and (ier < 5) then
     begin
     //i:=ier;
     ShowMessage('Ошибка вычисления корней'+' '+IntToStr(ier));
     end
   end;
  {----End of rooterr-----}
      {------atan2------}
function TForm1.atan2(x, y :double) :double;
   begin
   if x = 0.0 then
     if y = 0.0 then
       atan2 := 0
     else
       if y > 0.0 then atan2 := pi/2
       else atan2 := -pi/2
   else
     if x > 0.0 then
        atan2 := arctan(y/x)
     else
       if y >= 0.0 then
         atan2 := arctan(y/x) + pi
       else
         atan2 := arctan(y/x) - pi
   end;   {-----end  of atan2----}
function TForm1.fixn(x :double; n :integer) :string;
   var
     sign, nx, m, i :shortint;
     stn :string;
     cnx :string[3];
   begin
   if (x = 0.0) or (n < 1) then
     fixn := '0'
   else
     begin
     sign := ord(x < 0.0);
     x := abs(x);
     nx := trunc(ln(x)/ln(10.0));
     if x < 1.0 then nx := n - nx
     else nx := n - nx - 1;
     str(round(x*exp(nx*ln(10))),stn);
     nx := nx + n - length(stn);
     while copy(stn,length(stn),1) = '0' do
       delete(stn,length(stn),1);
     m := n - length(stn);
     if nx - m <> 0 then
       begin
       if (m - nx > 3) or (nx - n > 2) then
         begin
         if (n - m > 1) then insert('.',stn,2);
         str(n-nx-1, cnx);
         stn := concat(stn,'e',cnx)
         end
       else if (m - nx <= 3) and (nx < m) then
         for i := 1 to m-nx do stn := stn + '0'
       else if (nx < n) and (nx > m) then
         insert('.',stn,n-nx+1)
       else
         begin
         if nx - n <> 0 then
           for i := 1 to nx-n do stn := '0' + stn;
         stn := '0.' + stn
         end
       end;
     if sign = 1 then stn := '-' + stn;
     fixn := stn;
     end
   end;      {----- fixn -----}


//end;
procedure TForm1.FormActivate(Sender: TObject);
begin
tabfreq(Form1);
end;

end.

  Вверх
p0s0l
Дата 21.8.2003, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Graham, странно, но я запускал твою прогу и в TP и в Delphi - результаты абсолютно совпадают. Видимо ты допустил грубую ошибку при переносе из TP в Delphi.
Попробуй выложить DOS-версию...
P.S.: когда выкладываешь текст программы, пользуйся тэгами
Код
...
, чтобы нагляднее было и не терялось форматирование.



--------------------
С уважением, г-н Посол.
PM   Вверх
Bodya
Дата 21.8.2003, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 13.6.2003

Репутация: нет
Всего: нет



А не проще ли понять алгоритм расчета и переписать самому под делфи? По крайней мере будешь понимать что делаешь и где может возникнуть ошибка рачета.
PM MAIL   Вверх
Vit
Дата 21.8.2003, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



При первом взгляде на код я не вижу ничего что потенциально приводило бы к проблемам. Правда объявлено несколько указателей, но они не используются. Я бы решал таким образом: сделал в коде запись в лог файл, растыкал его во многие места по процедурам с выводом значений переменных. Дальше запустил бы TP и Дельфи - сравнил Лог файлы и локализовал на каком месте значения переменных становятся различными. Или трассанул код одновременно и в TP и в Дельфи - код же очень маленький - тут работы всего минут на 20...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Unregistered
Дата 21.8.2003, 15:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Graham, странно, но я запускал твою прогу и в TP и в Delphi - результаты абсолютно совпадают. Видимо ты допустил грубую ошибку при переносе из TP в Delphi.
Попробуй выложить DOS-версию...
P.S.: когда выкладываешь текст программы, пользуйся тэгами

Всмысле выложить девственно чистый код техже функций?
Ок сейчас...
Цитата
А не проще ли понять алгоритм расчета и переписать самому под делфи? По крайней мере будешь понимать что делаешь и где может возникнуть ошибка рачета.

Понять алгоритм рассчета не проще, т.к. это только маленькая часть всей программы.

  Вверх
Unregistered
Дата 21.8.2003, 16:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот практически не тронутый код, если чесно в паскале я практически ничего не понимаю, только могу понять код. У меня есть уже откомпиленая прога и исходники, исходники откомпилировать сам не могу ругается что версия tpcrt.tpu не та..уже даже с нета качал другую. Поправьте плиз этот код чтобы я его мог без проблем откопилитью и посмотреть результаты сам.
Код
program iwusnn;
 uses
   dos;
 {$l egavga.obj}

 procedure vgadrv; external;
 const
   nfx :byte = 4;
 type

   str16 = string[16];
   arrayb = array[1..24] of byte;
   arrayd = array[1..24] of double;
   opmenu = array[1..18] of dirstr;
   opxy = array[1..127] of str16;
   sply = ^spoly;
   spoly = record s :string; p :sply end;
   grdim = record
           
   pyt = ^yt;
   yt = record
        y, t :double;
        py :pyt
        end;
 var
   ptr :^integer;
   py0, pyi, pyw :pyt;
   ch :str16;
   vx, frm :dirstr;
   filc, filt, filq :str16;
   fcfg, ftab, fq :text;
   fl, qstab, qstart, equiv, grid :boolean;
   key :word;
   xc, yc, xc1, yc1, xm,
   jj, l, m, nb, n, nr, nrr, nd, ier, nright,
   na, ncx, mnu :byte;
   i, j, code :integer;
   c, cx, b0, b, a0, a, gd, dc, dr, qr, qi :arrayd;
   kr :arrayb;
   xlo, ylo, xhi, yhi, t, dt, tmin, tmax, temp, sr, si,
   tconst, ymin, ymax :double;
   directory :dirstr;
   prgm :namestr;
   dim :grdim;
           


 procedure rooterr;
   begin
   if (ier > 0) and (ier < 5) then
     begin
     writeln(' Ошибка в вычислении корней  ier = ',ier);

      end
   end;

 function atan2(x, y :double) :double;
   begin
   if x = 0.0 then
     if y = 0.0 then
       atan2 := 0
     else
       if y > 0.0 then atan2 := pi/2
       else atan2 := -pi/2
   else
     if x > 0.0 then
        atan2 := arctan(y/x)
     else
       if y >= 0.0 then
         atan2 := arctan(y/x) + pi
       else
         atan2 := arctan(y/x) - pi
   end;
   
   function fixn;
   var
     sign, nx, m, i :shortint;
     stn :str16;
     cnx :string[3];
   begin
   if (x = 0.0) or (n < 1) then
     fixn := '0'
   else
     begin
     sign := ord(x < 0.0);
     x := abs(x);
     nx := trunc(ln(x)/ln(10.0));
     if x < 1.0 then nx := n - nx
     else nx := n - nx - 1;
     str(round(x*exp(nx*ln(10))),stn);
     nx := nx + n - length(stn);
     while copy(stn,length(stn),1) = '0' do
       delete(stn,length(stn),1);
     m := n - length(stn);
     if nx - m <> 0 then
       begin
       if (m - nx > 3) or (nx - n > 2) then
         begin
         if (n - m > 1) then insert('.',stn,2);
         str(n-nx-1, cnx);
         stn := concat(stn,'e',cnx)
         end
       else if (m - nx <= 3) and (nx < m) then
         for i := 1 to m-nx do stn := stn + '0'
       else if (nx < n) and (nx > m) then
         insert('.',stn,n-nx+1)
       else
         begin
         if nx - n <> 0 then
           for i := 1 to nx-n do stn := '0' + stn;
         stn := '0.' + stn
         end
       end;
     if sign = 1 then stn := '-' + stn;
     fixn := stn;
     end
   end;      {----- fixn -----}
   
   procedure polrtt;
   const
     eps = 5.0e-7;
   var
     i, j, n, nt, nre, nc, n0, ii, jj, kr :byte;
     ind :shortint;
     d, x, y, temp :double;
     r, t :arrayd;

   procedure factor (n :byte; var a,r,t :arrayd; var nt :byte);
     var
       r1, t1, aa :arrayd;
       temp, er, ar :double;
       i, j, nr, nr1, ni, nt1 :byte;
     label mtk;
     begin
     ar := 0.0;
     for i := 1 to n - 1 do
       ar := ar + sqr(a[i]);
     ar := sqrt(ar/(n-1));
     for i := 1 to n + 1 do
       begin
       r[i] := a[i];
       if i > 1 then
         r1[i-1] := (i-1) * a[i]
       end;
     nr := n;
     nr1 := n - 1;
     for i := 1 to n + 1 do
       begin
       if i = 1 then t[i] := 1.0
       else t[i] := 0.0;
       t1[i] := 0.0
       end;
     nt := 0;
     repeat
       for i := 0 to nr - nr1 do
         begin
         ni := nr + 1 - i;
         r[ni] := r[ni] / r1[nr1 + 1];
         for j := 0 to nr1 - 1 do
           r[ni-nr1+j] := r[ni-nr1+j] - r[ni] * r1[j+1]
         end;
       for i := 1 to nr - nr1 + 1 do
         for j := 1 to nt + 1 do
           t1[i+j-1] := t1[i+j-1] + r[nr1+i] * t[j];
       nt1 := nr - nr1 + nt;
       for i := 1  to n + 1 do aa[i] := 0.0;
       for i := 1 to nr1 + 1 do
         for j := 1 to nt1 + 1 do
           aa[i+j-1] := aa[i+j-1] + r1[i] * t1[j];
       for i := 1 to nt1 + 1 do
         begin
         temp := t1[i];
         t1[i] := t[i];
         t[i] := temp
         end;
       nt := nt1;
       for i := 1 to nr1 + 1 do
         begin
         temp := r[i];
         r[i] := r1[i];
         r1[i] := temp
         end;
       nr := nr1;
       dec(nr1);
       while abs(r1[nr1 + 1]/ar) < eps do
         begin
         if nr1 = 0 then goto mtk;
         dec(nr1)
         end;
       mtk:
       er := 0.0;
       for i := 1 to n - 1 do
         er := er + sqr(a[i] - aa[i]);
       er := sqrt(er / (n - 2))/ar;
     until (er <= eps) or (nr1 = 0);
     if (nr1 = 0) and (er > eps) then
       begin
       r[1] := 1.0;
       nt := n;
       for i := 1 to n + 1 do t[i] := a[i]
       end;
     end;    {----- factor -----}

   procedure sturm (nt :byte; t :arrayd; var nr :byte);
     var
       p, s :arrayd;
       temp, w :double;
       i, j, ni, nleft, nright, np, ns :byte;
       l1, l2, r1, r2 : boolean;
     label mtk;
     begin
     nleft := 0;
     nright := 0;
     w := 0;
     for i := 1 to nt + 1 do
       begin
       p[i] := t[i] / t[nt+1];
       w := w + sqr(p[i]);
       if i > 1 then s[i-1] := (i - 1) * p[i] / nt
       end;
     w := sqrt(w/(nt+1));
     np := nt;
     ns := nt - 1;
     r1 := (p[np+1] > 0);
     l1 := not(r1 xor ((np mod 2) = 0));
     r2 := (s[ns+1] > 0);
     l2 := not(r2 xor ((ns mod 2) = 0));
     if r1 xor r2 then nright := nright + 1;
     if l1 xor l2 then nleft  := nleft  + 1;
     repeat
       for i := 0 to np - ns do
         begin
         ni := np + 1 - i;
         p[ni] := p[ni] / s[ns+1];
         for j := 0 to ns - 1 do
           p[ni-ns+j] := p[ni-ns+j] - p[ni] * s[j+1]
         end;
       for i := 1 to ns + 1 do
         begin
         temp := p[i];
         p[i] := s[i];
         s[i] := temp
         end;
       np := ns;
       dec(ns);
       while abs(s[ns+1]/w) < eps do
         begin
         if ns = 0 then goto mtk;
         dec(ns)
         end;
       mtk:
       w := 0;
       for i := 1 to ns + 1 do
         begin
         s[i] := -s[i] / abs(s[ns+1]);
         w := w + sqr(s[i])
         end;
       w := sqrt(w/(ns+1));
       l1 := l2;
       r1 := r2;
       r2 := s[ns+1] > 0;
       l2 := not (r2 xor ((ns mod 2) = 0));
       if l1 xor l2 then nleft  := nleft  + 1;
       if r1 xor r2 then nright := nright + 1;
     until ns <= 0;
     nr := nleft - nright
     end;    {----- sturm -----}

   procedure newrea(n :byte; t :arrayd; var x :double);
     var
       f, temp, xl, xr, dx :double;
       kit, i, j :integer;
     begin
     xl := 0.0; xr := 0.0;
     for i := 2 to n + 1 do
       if abs(t[i]) > xl then xl := abs(t[i]);
     xl := 1.0 / (1.0 + xl / abs( t[1] ));
     for i := 1 to n do
       if abs(t[i]) > xr then xr := abs(t[i]);
     xr := 1.0 + xr / abs(t[n+1]);
     dx := 0.25 * (xr - xl);
     x := xl;
     kit := 0;  j := 0;
     repeat
       inc(kit);
       if kit >= 200 then
         begin
         inc(j);
         if j = 10 then begin ier := 1; exit end;
         kit := 0;
         xl := -xl;
         if xl > 0.0 then xl := xl + dx;
         x := xl
         end;
       f := t[n+1];
       for i := n downto 1 do f := f * x + t[i];
       if n > 1 then
         begin
         temp := n * t[n+1];
         for i := n downto 2 do
           temp := temp * x + (i - 1) * t[i]
         end
       else temp := t[2];
       x := x - f / temp;
     until abs(f / temp / x) < eps;
     end;    {----- newrea -----}

   procedure newcom(n :byte; t :arrayd; var x, y :double);
     var
       u, v, ux, vx, dx, dy, temp, xl, xr, dxl :double;
       kit, i, j :integer;
     begin
     xl := 0.0; xr := 0.0;
     for i := 2 to n + 1 do
       if abs(t[i]) > xl then xl := abs(t[i]);
     xl := 1.0 / (1.0 + xl / abs( t[1] ))/sqrt(2.0);
     for i := 1 to n do
       if abs(t[i]) > xr then xr := abs(t[i]);
     xr := (1.0 + xr / abs(t[n+1]))/sqrt(2.0);
     dxl := 0.25 * (xr - xl);
     x := xl; y := xl;
     kit := 0;  j := 0;
     repeat
       inc(kit);
       if kit >= 200 then
         begin
         inc(j);
         if j = 10 then begin ier := 1; exit end;
         kit := 0;
         xl := -xl;
         if xl > 0.0 then xl := xl + dxl;
         x := xl;  y := -xl
         end;
       u := t[n+1];
       v := 0.0;
       for i := n downto 1 do
         begin
         temp := x * v + y * u;
         u := x * u - y * v + t[i];
         v := temp
         end;
       ux := n * t[n+1];
       vx := 0.0;
       for i := n downto 2 do
         begin
         temp := x * vx + y * ux;
         ux := x * ux - y * vx + (i - 1) * t[i];
         vx := temp
         end;
       temp := sqr(ux)+sqr(vx);
       dx := (u * ux + v * vx) / temp;
       dy := (v * ux - u * vx) / temp;
       x := x - dx;
       y := y - dy;
     until (abs(dx) + abs(dy)) / (abs(x) + abs(y)) < eps;
     end;  {----- newcom -----}

   procedure residu(nr :byte; r :arrayd;
                    r0, x0, y0 :double; var kr :byte);

     function sign(a :double) :double;
       begin
       if a >= 0 then sign := 1.0 else sign := -1.0
       end;

     var
       phi, phip, dphi, darg, x, y, u, v, t :double;
       i, j :integer;
     begin
     dphi := 2 * pi / nr / 16;
     darg := 0.0;
     for i := 0 to nr * 16 do
       begin
       x := x0 + r0 * cos(dphi * i);
       y := y0 + r0 * sin(dphi * i);
       u := r[nr+1];
       v := 0;
       for j := nr downto 1 do
         begin
         t := x * v + u * y;
         u := x * u - y * v + r[j];
         v := t
         end;
       if u = 0.0 then phi := sign(v) * pi / 2.0
       else if u > 0.0 then phi := arctan (v / u)
       else if y <> 0.0 then
         phi := arctan (v / u) + sign(v) * pi
       else phi := pi;
       if i = 0 then phip := phi
       else
         begin
         if ((abs(phi) > pi/2.0) or (abs(phip) > pi/2.0))
           and (sign(phi) <> sign(phip)) then
           begin
           if sign(phi) > 0.0 then t := phi - phip - 2.0 * pi
           else t := phi - phip + 2.0 * pi;
           end
         else t := phi - phip;
         darg := darg + t;
         phip := phi
         end
       end;
     kr := round (darg / (2.0 * pi))
     end;    {----- residu -----}

   begin     {----- polrtt -----}
   ier := 0;
   if (na <= 0) or (na > 23) then
     begin
     ier := 2;
     exit
     end;
   if a[na+1] = 0.0 then
     begin
     ier := 3;
     exit
     end;
   n := na;
   { «?nN?N??N ???No?? ¬«??N? }
   nr := 0;
   nrr := 0;
   krat[1] := 0;
   while (a[1] = 0.0) and (n > 0) do
     begin
     krat[1] := krat[1] + 1;
     n := n - 1;
     for i := 1 to n+1 do a[i] := a[i+1];
     end;
   if krat[1] <> 0 then
     begin
     inc(nr);
     inc(nrr);
     qr[nr] := 0.0;
     qi[nr] := 0.0
     end;
   if n = 0 then exit;
   if n = 1 then
     begin
     inc(nr);
     inc(nrr);
     qr[nr] := -a[1] / a[2];
     qi[nr] := 0.0;
     krat[nr] := 1;
     exit
     end;
   if n = 2 then
     begin
     d := sqr(a[2])-4.0*a[1]*a[3];
     if abs(d/(sqr(a[1])+sqr(a[2])+sqr(a[3])))
       < sqr(eps) then d := 0;
     if d = 0 then
       begin
       inc(nr);
       inc(nrr);
       qr[nr] := -0.5 * a[2] / a[3];
       qi[nr] := 0;
       krat[nr] := 2;
       exit
       end;
     if d < 0 then
       begin
       inc(nr);
       qr[nr] := -0.5 * a[2] / a[3];
       qi[nr] := 0.5 * sqrt( -d ) / a[3];
       krat[nr] := 1;
       inc(nr);
       qr[nr] := qr[nr-1];
       qi[nr] := -qi[nr-1];
       krat[nr] := 1
       end
     else
       begin
       if a[2] < 0.0 then d := -0.5 * (a[2] - sqrt(d))
       else d := -0.5 * (a[2] + sqrt(d));
       inc(nr);
       qr[nr] := d / a[3];
       qi[nr] := 0.0;
       krat[nr] := 1;
       inc(nr);
       qr[nr] := a[1] / d;
       qi[nr] := 0.0;
       krat[nr] := 1;
       inc(nrr,2);
       end;
     exit
     end;
   { oa¬?«???aµ?? »«???«?a  C = R * ?
   *******   R -- ?.«.n. C ? C'
   *******   T -- »«???«? ? »?«????? ¬«????? }
   factor (n, a, r, t, nt);
   if nt = 1 then
     begin
     inc(nr);
     inc(nrr);
     qr[nr] := -t[1] / t[2];
     qi[nr] := 0.0;
     krat[nr] := n;
     exit
     end;
   { e?????N??N ????a nN???o??N????? ¬«??N? }
   sturm (nt, t, nre);
   inc(nrr, nre);
   { e?????N??N nN???o??N????? ¬«??N?  }
   if nre > 0 then
     for i := 1 to nre do
       begin
       newrea(nt + 1 - i, t, x);
       if ier = 1 then exit;
       nr := nr + 1;
       qr[nr] := x;
       qi[nr] := 0.0;
       krat[nr] := 1;
       { e?¬???N??N o?????N??«u« ¬«??? }
       for j := nt + 1 - i downto 2 do
         t[j] := t[j] + x * t[j+1];
       for j := 1 to nt + 1 - i do t[j] := t[j+1]
       end;
   { e?????N??N ¬«?»?N¬???? ¬«??N? }
   nc := (nt - nre) div 2;
   if nc > 0 then
     for i := 1 to nc do
       begin
       newcom(2 * (nc+1-i), t, x, y);
       if ier = 1 then exit;
       for j := nr + 1 to nr + 2 do
         begin
         qr[j] := x;
         qi[j] := abs(y);
         krat[j] := 1
         end;
       nr := nr + 2;
       qi[nr] := -qi[nr];
       { e?¬???N??N o?????N??«u« ¬«??? }
       temp := sqr(x) + sqr(y);
       t[2*(nc+1-i)] := t[2*(nc+1-i)] + 2*x*t[2*(nc-i)+3];
       for j := 2 * (nc - i) + 1 downto 3 do
         t[j] := t[j] + 2 * x * t[j+1] - temp * t[j+2];
       for j := 1 to 2 * (nc - i) + 1 do
         t[j] := t[j+2];
       end;
   d := 0;
   for i := 1 to nr do
     d := d + sqrt(sqr(qr[i]) + sqr(qi[i]));
   d := d/nr;
   for i := 1 to nr do
     begin
     if abs(qr[i])/d < eps then qr[i] := 0;
     if abs(qi[i])/d < eps then qi[i] := 0;
     end;
   { e?????N??N ¬?a??«??? ¬«??? }
   if nt < n then
     begin
     n0 := 0;
     if (qr[1] = 0.0) and (qi[1] = 0.0) then n0:=1;
     for i := 1 to nre + nc do
       begin
       { e?????N??N ???. ?a???«???? }
       if i <= nre then ii := n0 + i
       else ii := n0 + 2 * i - nre - 1;
       ind := -1;
       for jj := n0 + 1 to n0 + nre + 2*nc do
         if jj <> ii then
           begin
           if ind < 0 then
             begin
             y := sqr(qr[ii] - qr[jj]);
             temp := y + sqr(qi[ii] - qi[jj]);
             ind := 1;
             end
           else
             begin
             y := sqr(qr[ii] - qr[jj]);
             if temp > y + sqr(qi[ii] - qi[jj]) then
               temp := y + sqr(qi[ii] - qi[jj]);
             end;
           end;
       { Ean??? «¬????«??? o«¬??u «?N?Nn?«u« ¬«??? }
       temp := 0.5 * sqrt(temp);
       x := qr[ii];
       y := qi[ii];
       residu (n - nt, r, temp, x, y, kr);
       if kr > 0 then
         begin
         if i <= nre then krat[ii] := krat[ii] + kr
         else
           begin
           krat[ii]  := krat[ii] + kr;
           krat[ii+1] := krat[ii+1] + kr;
           end
         end;
       end; { for }
     end; { if }
   j := 0;
   for i := 1 to nr do j := j + krat[i];
   if j <> na then ier := 4;
   end;      {----- polrtt -----}


   procedure tabfreq;
   const eps = 1.0e-40;
   var
     i, j, y, js :word;
     w0, w1, dw, w, am, p, x :double;
     code, count :integer;
     s :string[32];
     nrb, nrrb :byte;
     qrb, qib :arrayd;
     krb :arrayb;
     rdk :char;
   begin

vx := '1(t)';
     tconst := 1;
     ncx := 2;
     cx[1] := 1; cx[2] := -0.5; cx[3] := 0.2;
     //xlo := 10; ylo := 10; xhi := 90; yhi := 90;
     //equiv := false; grid := false;
     n := 5;
     a0[1] := 1; a0[2] := 2; a0[3] := 3; a0[4]:=4; a0[5]:=5; a0[6]:=6;
     m := 0;
     b0[1] := 1;// b0[2] := 2;// b0[3] := 3; b0[4]:=4;
   ///------------
   w0:=1;  // нач частота
           //until (code = 0) and ( ((a0[1]=0) and (w0 > 0)) or
            //                      ((a0[1]<>0) and (w0 >= 0))) ;
   w1:=10; // кон частота
   dw:=1;  // шаг
           //until (code = 0) and (dw < (w1 - w0));
               //writeln(fq, 'w':16, 'A(w)':16, 'A(w) дБ':16,
               //  'fi(w) град':16);
               td:=0;
               tr:=td;
   polrtt(n, a0, qr, qi, nr, nrr, kr, ier);
   rooterr;
   if (ier > 0) and (ier < 5) then exit;
   if m > 0 then
     begin
     polrtt(m, b0, qrb, qib, nrb, nrrb, krb, ier);
     rooterr;
     if (ier > 0) and (ier < 5) then exit
     end;
   j := 0;
   js := 0;
   rdk := #32;
   repeat
     w := w0 + j*dw;
     inc(j);
     count := 0;
     am := abs(b0[m+1]/a0[n+1]);
     p := 0;
     if b0[m+1]*a0[n+1] < 0.0 then
       p := p - pi;
     if m > 0 then
       begin
       for i := 1 to nrrb do
         for jj := 1 to krb[i] do
           begin
           am := am*sqrt(sqr(qrb[i]) + sqr(w));
           p := p + atan2(-qrb[i], w)
           end;
       for i := nrrb + 1 to nrb do
         begin
         for jj := 1 to krb[i] do
           begin
           x := sqr(sqr(qrb[i]) + sqr(qib[i]) + sqr(w)) -
             sqr(2*qib[i]*w);
           if x < eps then inc(count)
           else am := am*sqrt(x);
           p := p + atan2(sqr(qrb[i]) + sqr(qib[i]) - sqr(w),
             -2*qrb[i]*w)
           end;
         inc(i)
         end
       end;
     for i := 1 to nrr do
       for jj := 1 to kr[i] do
         begin
         am := am/sqrt(sqr(qr[i]) + sqr(w));
         p := p - atan2(-qr[i], w)
         end;
     for i := nrr + 1 to nr do
       begin
       for jj := 1 to kr[i] do
         begin
         x := sqr(sqr(qr[i]) + sqr(qi[i]) + sqr(w)) -
           sqr(2*qi[i]*w);
         if x < eps then dec(count)
         else am := am/sqrt(x);
         p := p - atan2(sqr(qr[i]) + sqr(qi[i]) - sqr(w),
           -2*qr[i]*w)
         end;
       inc(i)
       end;
     if count > 0 then am := 0;
     if count = 0 then
       begin
         writeln(fixn(w, nfx):16, fixn(am, nfx):16,
           fixn(20*ln(am)/ln(10.0), nfx):16,
           fixn(p*180.0/pi, nfx):16);
         writeln(fq, fixn(w, nfx):16, fixn(am, nfx):16,
           fixn(20*ln(am)/ln(10.0), nfx):16,
           fixn(p*180.0/pi, nfx):16)
       end
     else
       if count > 0 then
         begin
         writeln(fixn(w, nfx):16, fixn(am, nfx):16,
           '- тьма':16, fixn(p*180.0/pi, nfx):16);
         writeln(fq, fixn(w, nfx):16, fixn(am, nfx):16,
           '- тьма':16, fixn(p*180.0/pi, nfx):16)
         end
       else
         begin
         writeln(fixn(w, nfx):16,'Резонанс':24);
         writeln(fq,fixn(w, nfx):16,'Резонанс':24)
         end;
     inc(js);
     if (js = 20) and (w < w1) then
       begin
       js := 0;
       writeln;
       fastcenter(cht, 23, $70);
       rdk := readkey
       end
   until (w >= w1) or (rdk = #27);
   close(fq);
   writeln;
   if rdk <> #27 then
     begin
     fastcenter('      Конец таблицы      ',22, textattr);
     fastcenter(cht, 23, $70);
     readkey
     end;
   normalcursor;
   window(1, 1, 80, 25)
   end;      {----- tabfreq -----}

 begin       {----- main -----}
 textattr := $1b;
 if registerbgidriver(@vgadrv) < 0 then
   begin
   writeln(' Ошибка при регистрации драйвера.');
   halt(1);
   end;
 clrscr;
   tabfreq;
 
 end.


  Вверх
p0s0l
Дата 21.8.2003, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Ты хоть бы выкладывал РАБОЧИЕ версии, а то, что первая твоя прога (в Delphi) не компилировалась,
что эта...

Ну ладно. Ошибку я нашел. Проблема в циклах:
если в TP можно в цикле менять переменную цикла, то в Delphi это запрещается:
Код
for i := 1 to 10 do
begin
 ... вычисления с i
 i := i + 1;
end;

это бы проехало в TP, но Delphi заругается. Вышеприведенный цикл увеличивает i на 2.
А так как в твоей DOS-проге есть такие "плохие" циклы, ты их заменил на while.
Ты сделал правильно, что заменил на while, но ты забыл про увеличение i.

Вот один из циклов, который был в TP:
Код
for i := nrr+1 to nr do
begin
 for jj := 1 to kr[i] do//kr[i]
 begin
   x := sqr(sqr(qr[i]) + sqr(qi[i]) + sqr(w)) -
   sqr(2*qi[i]*w);
   if x < eps then dec(count)
     else am := am/sqrt(x);
   p := p - atan2(sqr(qr[i]) + sqr(qi[i]) - sqr(w), -2*qr[i]*w)
 end;
 inc(i); // !!!!!!!!!!!!!!!!!!!!
end;

Ты просто его заменил на:
Код
i := nrr + 1;
while i <= nr do
begin
 for jj := 1 to kr[i] do//kr[i]
 begin
   x := sqr(sqr(qr[i]) + sqr(qi[i]) + sqr(w)) - sqr(2*qi[i]*w);
   if x < eps then dec(count)
     else am := am/sqrt(x);
   p := p - atan2(sqr(qr[i]) + sqr(qi[i]) - sqr(w), -2*qr[i]*w)
 end;
 inc(i); // !!! тут надо inc(i, 2)
end;

но вместо inc(i) надо inc(i, 2)...

Надеюсь ты найдешь этот цикл, он находится в процедуре tabfreq.

Чуть повыше есть еще один практически идентичный цикл:
Код
 i := nrrb + 1;
 while i <= nrb do // в TP тут был for
 begin
   for jj := 1 to krb[i] do
   begin
     x := sqr(sqr(qrb[i]) + sqr(qib[i]) + sqr(w)) - sqr(2*qib[i]*w);
     if x < eps then inc(count)
       else am := am*sqrt(x);
     p := p + atan2(sqr(qrb[i]) + sqr(qib[i]) - sqr(w), -2*qrb[i]*w)
   end;
   inc(i, 2); // <- тут уже исправлено !
 end;

Хотя в этот цикл программа ниразу не приходила ...



--------------------
С уважением, г-н Посол.
PM   Вверх
Unregistered
Дата 22.8.2003, 12:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да циклы найду...они моя головная боль.
Только не понял почему инкрементировать надо на 2, а не на 1.
  Вверх
Unregistered
Дата 22.8.2003, 12:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











p0s0l, кинь плиз ,то что ты компилил в паскале и то что ты компилил в делфи, на мыло [email protected]
  Вверх
<Spawn>
Дата 22.8.2003, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Цитата(Unregistered @ 22.8.2003, 04:18)
Да циклы найду...они моя головная боль.
Только не понял почему инкрементировать надо на 2, а не на 1.

Потому что сам цикл for реализует инкрементацию на 1, да еще и в теле цикла была на 1. Того 1+1=2 smile.gif


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Unregistered
Дата 22.8.2003, 12:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я не могу в ТР ничего откомпилировать...
при попытке откомпилить выдает ошибку 116, на первой строчке if ... then, в функции atan2. Маркер мигает под "t"hen.
  Вверх
p0s0l
Дата 22.8.2003, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



В твоей последней проге была тьма ошибок (в основном не хватало переменных), но с аТаном все нормально было... А переделанные проги я тебе кинул.



--------------------
С уважением, г-н Посол.
PM   Вверх
val
Дата 22.8.2003, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: нет
Всего: 7



Возможно при записи в таблицу идёт неправильное преобразование численного типа в строковый...


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0734 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.