Neočekávané chování programu – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Neočekávané chování programu – Pascal – Fórum – Programujte.comNeočekávané chování programu – Pascal – Fórum – Programujte.com

 

Kalgys0
Návštěvník
7. 10. 2012   #1
-
0
-

Ahoj, můžete mi prosím pomoci zjistit, co to můj program vyvádí? Jeho úkolem je vykreslovat fraktály jako Kochova vločka a její obdoby s různým počátečním útvarem. Má fungovat v konečném počtu kroků (kupodivu :D ) a v každém kroku přidá novou "vrstvu". Tj. první krok udělá trojúhelník apod, další udělá 6cípou hvězdu atd., a však už při třetím kroku se mi v polovině "vrstvy" (první polovina je bez zádrhelu) začnou objevovat prapodivná čísla a při 4. kroku se přibližně ve stejné oblasti, kde se objevuje první anomálie zasekne. Matematický podklad mám bezchybný (za to dám cizí ruku do ohně). 

program vlocka;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp,crt,math
  { you can add units after this };
const pocetperiod=5;
      rad='perioda';
      fr='Fraktal\';
      tx='.txt';
      poctvar=3;
type bod=record
  x,y:real;
end;

var x,y,x0,y0,u1,u2,v1,v2:real;
  i,j:byte;
  A,A0,B:bod;
  F:array[1..pocetperiod] of text;
  Fname:array[1..pocetperiod] of string;
  g:text;
  Aname,Bname,Name1,Name2:string;
function strtoreal(str:string):real;          //fungujici bezchybne
         var Ccast:byte;
             Dcast:real;
             i,i0:byte;
         begin
              i:=2;
              case str[1] of
              ' ':
                  begin
                       Ccast:=StrToInt(str[2]);
                       i:=i+1;
                  end;
              '-':
                  begin
                       Ccast:=-StrToInt(str[2]);
                       i:=i+1;
                  end;
              else
                  Ccast:=StrToInt(str[1]);
              end;
              i0:=i;
              Dcast:=0;
              repeat
                    i:=i+1;
                    Dcast:=Dcast+StrToInt(str[i])*power(10,i0-i);
              until(i=Length(str));
              if str[1]='-' then strtoreal:=Ccast-Dcast
              else strtoreal:=Ccast+Dcast;
         end;
begin
     CreateDir('Fraktal');       //vytvor slozku
     for i:=1 to pocetperiod do
         begin
              Fname[i]:=fr+rad+IntToStr(i)+tx;  //vytvor textaky pro souradnice
              assign(F[i],Fname[i]);
              rewrite(f[i]);
              close(f[i]);
         end;
     x:=cos(pi/2);      //x prvniho bodu
     y:=sin(pi/2);      //y prvniho bodu
     append(f[1]);
     writeln(F[1],x:0:6,',',y:0:6);  //zapis prvni bod do prvniho textaku
     for i:=2 to poctvar+1 do
         begin
              x:=cos(pi/2-((i-1)*2*pi)/(poctvar));     //x nasledujicich bodu (pootoceno vzdy o 2Pi/n)
              y:=sin(pi/2-(2*pi*(i-1))/(poctvar));     //y -||-
              writeln(F[1],x:0:6,',',y:0:6);           //zapis x,y
         end;
     close(f[1]);          //prvni textak je hotovy a funguje
//----------------------------------------------------------------------------------------------------
     for i:=2 to pocetperiod do
         begin
              reset(f[i-1]);     //otevre predchozi textak ke cteni
              append(F[i]);      //otevre nynejsi textak(prazdny) k zapisu
              readln(F[i-1],Name1);  //precte prvni bod(0,1)d z predchoziho textaku
              j:=0;
              Aname:='';
              repeat
                    j:=j+1;
                    Aname:=Aname+Name1[j];
              until(Name1[j+1]=',') ;
              A.x:=strtoreal(Aname);    //x prvniho bodu v cisle (0)
              j:=j+1;
              Bname:='';
              repeat
                    j:=j+1;
                    Bname:=Bname+Name1[j];
              until(j=Length(Name1));
              A.y:=strtoreal(Bname);   //y -||- (1)
              writeln(F[i],Name1);     //zapis bodu A do noveho textaku
              A0:=A;                   //ulození hodnoty bodu A
              while not eof(F[i-1]) do
                    begin
                         readln(F[i-1],Name2);  //nacteni bodu B z predchoziho textaku
                         j:=0;
                         Aname:='';
                         repeat
                               j:=j+1;
                               Aname:=Aname+Name2[j];                      //prevod z textu na cisla
                         until(Name2[j+1]=',') ;
                         B.x:=strtoreal(Aname);           //x bodu B
                         j:=j+1;
                         Bname:='';
                         repeat
                               j:=j+1;
                               Bname:=Bname+Name2[j];
                         until(j=Length(Name1));
                         B.y:=strtoreal(Bname);    //y bodu B
                         x:=((2*A.x)+B.x)/3;       //x bodu ve tretine usecky mezi A a B (blize A)
                         y:=((2*A.y)+B.y)/3;       //y -||-
                         x0:=x;
                         y0:=y;
                         writeln(F[i],x:0:6,',',y:0:6);   //zapis vyse zmineneho bodu
                         u1:=x-A.x;    //x vektoru z A do X
                         u2:=y-a.y;    //y -||-
                         v1:=u1*cos(Pi-(2*Pi)/poctvar)-u2*sin(Pi-(2*Pi)/poctvar);
                         v2:=u2*cos(Pi-(2*Pi)/poctvar)+u1*sin(Pi-(2*Pi)/poctvar);
                         x:=v1+x;
                         y:=v2+y;
                         writeln(F[i],x:0:6,',',y:0:6);  //zapis nalezeneho bodu
                         if poctvar>3 then //pro pocatecni tvar s vice uhy nez 3
                            for j:=1 to poctvar-3 do  //pocet bodu, ktere jsou mimo usecku AB
                                begin
                                     u1:=x-x0;
                                     u2:=y-y0;
                                     v1:=u1*cos(Pi-(2*Pi)/poctvar)+u2*sin(Pi-(2*Pi)/poctvar);
                                     v2:=u2*cos(Pi-(2*Pi)/poctvar)-u1*sin(Pi-(2*Pi)/poctvar);
                                     x0:=x;
                                     y0:=y;
                                     x:=v1+x;
                                     y:=v2+y;
                                     writeln(F[i],x:0:6,',',y:0:6);//zapis dalsich bodu
                                end;
                         x:=(A.x+2*B.x)/3;
                         y:=(A.y+2*B.y)/3;
                         writeln(F[i],x:0:6,',',y:0:6);
                         writeln(F[i],B.x:0:6,',',B.y:0:6);
                         A:=B;
                    end;
              writeln(F[i],A0.x:0:6,',',A0.y:0:6);
              close(F[i]);
              close(F[i-1]);
         end;

end.

Nahlásit jako SPAM
IP: 212.47.23.–
KIIV
~ Moderátor
+43
God of flame
8. 10. 2012   #2
-
0
-

co zneuzit debuggeru a odkrokovat program?

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kalgys0
Návštěvník
8. 10. 2012   #3
-
0
-

#2 KIIV
s debugerem jsem ještě nepracoval, můžeš mi poradit (používám lazarus)

Nahlásit jako SPAM
IP: 213.155.225.–
KIIV
~ Moderátor
+43
God of flame
8. 10. 2012   #4
-
0
-

no spustis to v debug modu - lazarus tu momentalne nemam takze nereknu presne - a pak jen mackas neco jako step--- provede se jedna akce a potom se to zastavi

dalsi moznost je, pokud vis kde se to priblizne zasekava, tak si tam nastavit breakpoint nekde pred, spustit podobne jako predchozi, ale musi tam byt neco jako run-... to pak vykona vse dokud nenarazi na breakpoint... pak muzes dal krokovat

nekde na netu musi byt urcite popis co a jak funguje

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hostk
~ Anonymní uživatel
5 příspěvků
8. 10. 2012   #5
-
0
-
  • Debbuger - krokování
  • Ladící výpisy

 zdrojový kod vkládej pomocí "vložit zdrojový kód" <?

Nahlásit jako SPAM
IP: 147.228.108.–
mjseven0
Návštěvník
8. 10. 2012   #6
-
+1
-
Zajímavé

V rychlosti jsem to protahl Lazarem. Chyba je ve funkci strtoreal.
Dochází tam k pokusu o přečtení znaku s vyšším indexem než je délka řetězce.
Pokud nevíš jak použít debbuger, můžeš si v ladění pomoci průběžným výpisem hodnoty (ladící výpisy) proměnných pomocí write, writeln.

 

Nahlásit jako SPAM
IP: 213.220.235.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý