problème de calucul de temps.

problème de calucul de temps. - Ada - Programmation

Marsh Posté le 17-08-2010 à 17:31:09    

bonjour, dans ce programme, j'essaie d'incrémenter ou décrémenter une variable de type duration à raison de 0.01 par iteration, mais malgrès le calcul tu temps d'exécution de l'algorithme global, je ne parviens pas à une minute par minute.
 
Je viens donc chercher votre clairvoyance sur le sujet.
 
Mon calcul est simple, j'initialise une variable de type time à clock et j'exécute un delay de 0.01 - (clock - date) et je met date à jour avec clock.
 
Merci pour votre aide.
 
Voici le code de Main :
 

Code :
  1. with Free_Will, Expectancy;
  2. use Free_Will, Expectancy;
  3. with Text_Io;
  4. use Text_Io;
  5. with Interfaces.C;
  6. use Interfaces;
  7. with Calendar;
  8. use Calendar;
  9. procedure Main is
  10.  
  11.   function system(Command : C.Char_Array) return C.Int;
  12.   pragma Import (C, System, "system" );
  13.   Errno : C.Int;
  14.  
  15.  
  16.   CFinality  : Long_integer := 0;
  17.   CChaos     : Long_integer := 0;
  18.   CEquality  : Long_integer := 0;
  19.  
  20.   save, Choice : T_Choice := Equality;
  21.   Date : Time := clock;
  22.   step : Duration := 1.0;
  23.   Freq_Chaos, Chaos_Per_Step : Natural := 0;
  24.   Freq_Finality, Finality_Per_Step : Natural := 0;
  25.   Freq_Equality, Equality_Per_Step : Natural := 0;
  26.  
  27.   Tchaos : natural := 0;
  28.   Tfinality : natural := 0;
  29.   Tequality : natural := 0;
  30.  
  31.   Left : Duration := 0.0;
  32.  
  33. begin
  34.  
  35.   Reset;
  36.   loop
  37.      begin
  38.         Choice := Action;
  39.         case Choice is
  40.            when Finality =>
  41.               CFinality := CFinality + 1;
  42.               Finality_Per_Step := Finality_Per_Step + 1;
  43.  
  44.            when Chaos =>
  45.               CChaos := CChaos + 1;
  46.               Chaos_Per_Step := Chaos_Per_Step + 1;
  47.  
  48.            when Equality =>
  49.               CEquality := CEquality + 1;
  50.               Equality_Per_Step := Equality_Per_Step + 1;
  51.  
  52.         end case;
  53.         Errno := System(C.To_C("cls" ));
  54.         if Choice = Finality then
  55.            Put("finality : * " & Long_Integer'Image(CFinality));
  56.         else
  57.            Put("finality :   " & Long_Integer'Image(CFinality));
  58.         end if;
  59.  
  60.         Put_Line("  freq : " & Natural'Image(Freq_Finality));
  61.  
  62.         if Choice = Chaos then
  63.            Put("chaos    : * " & Long_Integer'Image(CChaos));
  64.         else
  65.            Put("chaos    :   " & Long_Integer'Image(CChaos));
  66.         end if;
  67.  
  68.         Put_Line("  freq : " & Natural'Image(Freq_Chaos));
  69.  
  70.         if Choice = Equality then
  71.            Put("equality : * " & Long_Integer'Image(CEquality));
  72.         else
  73.            Put("equality :   " & Long_Integer'Image(CEquality));
  74.         end if;
  75.  
  76.         Put_Line("  freq : " & Natural'Image(Freq_Equality));
  77.  
  78.         Put("Winner   : " );
  79.  
  80.         if Cfinality + CEquality > CChaos + CEquality then
  81.            Put_Line(T_Choice'Image(Finality));
  82.            if save /= finality then
  83.               Tfinality := Tfinality + 1;
  84.               save := finality;
  85.            end if;
  86.         elsif
  87.           Cfinality + CEquality < CChaos + CEquality then
  88.            Put_Line(T_Choice'Image(Chaos));
  89.            if save /= chaos then
  90.               Tchaos := Tchaos + 1;
  91.               save := chaos;
  92.            end if;
  93.  
  94.         else
  95.            Put_Line(T_Choice'Image(Equality));
  96.            if save /= equality then
  97.               Tequality := Tequality + 1;
  98.               save := equality;
  99.            end if;
  100.  
  101.         end if;
  102.  
  103.         put_line("Count of transitions to : " );
  104.         put_line("Finality : " & natural'image(Tfinality));
  105.         put_line("Chaos    : " & natural'image(TChaos));
  106.         put_line("Equality : " & natural'image(Tequality));
  107.  
  108.         put_line("Midle count between tow transitions : " );
  109.         put_line("Finality : " & float'image(float(Cfinality)/(float(Tfinality)+Float(Tchaos)+Float(Tequality))));
  110.         put_line("Chaos    : " & float'image(float(Cchaos)/(float(Tfinality)+Float(Tchaos)+Float(Tequality))));
  111.         put_line("Equality : " & float'image(float(Cequality)/(float(Tfinality)+Float(Tchaos)+Float(Tequality))));
  112.  
  113.         case save is
  114.            when Finality =>
  115.               Life_Cycle.Finality;
  116.            when Chaos =>
  117.               Life_Cycle.Chaos;
  118.            when Equality =>
  119.               Life_Cycle.Equality;
  120.         end case;
  121.  
  122.         Life_Cycle.Expectancy(Left);
  123.         Put("Time Left : " & Duration'Image(Left));
  124.         if Left < 0.0 then
  125.            exit;
  126.         end if;
  127.         delay 0.01 - (Clock - Date);
  128.         Date := Clock;
  129.         Step := Step - 0.01;
  130.         if Step = 0.0 then
  131.            Step := 1.0;
  132.            Freq_Chaos := Chaos_Per_Step;
  133.            Chaos_Per_Step := 0;
  134.            Freq_Finality := Finality_Per_Step;
  135.            Finality_Per_Step := 0;
  136.            Freq_Equality := Equality_Per_Step;
  137.            Equality_Per_Step := 0;
  138.         end if;
  139.  
  140.  
  141.      exception
  142.         when others =>
  143.            exit;
  144.      end;
  145.   end loop;
  146.  
  147.  
  148. end Main;


 
Vous trouverai dans le zip pour Windows un exécutable pour constater.
La dernière ligne indique l'incrémentation ou la décrémentation en question.

Reply

Marsh Posté le 17-08-2010 à 17:31:09   

Reply

Marsh Posté le 17-08-2010 à 18:10:49    

Je pense avoir trouvé.... Le  problème est qu'il me faut plus d'un centième de seconde pour exécuter l'algorithme. J'ai donc réduit la raison d'itération à 0.1, et ça roule.
 
Merci.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed