[Algo/Ada] Itération et modulo.

Itération et modulo. [Algo/Ada] - Algo - Programmation

Marsh Posté le 18-10-2012 à 13:41:37    

Bonjour,
J'avais ce code : http://jovalise.net/sources/alchem [...] oducer.adb
Pour corriger mon problème j'ai délcaré un nouveau type Extended_Step_Index_Type dérivé de Step_Index_Type comprenant zéro, et j'ai modifier l'ago comme suit : http://jovalise.net/sources/alchem [...] ducer2.adb
Je voudrais savoir si il n'y aurait pas une solution pour m'éviter de déclarer ce nouveau type.
 
Les problème sous jacent de la première version sont, selon l'ordre d'exécution testé, une incrémentation de "part" avant la fin ou au début de celle-ci.
Donc, soit il manque la ou les première notes, soit il manque les dernière.
 
 
Les soures complète  : ici
 
Je vous met un peut de code pour faire joli.
 
 
Previsious code :

Code :
  1. --
  2.            or
  3.            delay until Start_Time;
  4.            Start_Time := Start_Time + Quantum;
  5.            Clear(The_Vector);
  6.           
  7.           
  8.           
  9.            The_Vector := Step_Of(Parts(The_Part).all, Current_Step);          
  10.           
  11.            Sheduler_Process.Receive(The_Vector, Current_step);                     
  12.                      
  13.            if Current_Step + 1 > Step_Index_Type'Last then
  14.           Current_Step := 1;
  15.            else
  16.           Current_Step := Current_Step + 1;
  17.           
  18.            end if;                     
  19.           
  20.            if (Current_Step mod 32) = 0 then
  21.           The_Part := Wrap_Succ(The_Part);
  22.            end if;
  23.           
  24.         end select;


Current code :

Code :
  1. --
  2.         or
  3.            delay until Start_Time;
  4.            Start_Time := Start_Time + Quantum;
  5.            Clear(The_Vector);
  6.           
  7.            Current_Step := Current_Step + 1;
  8.           
  9.            if (Current_Step mod 32) = 0 then
  10.              The_Part := Wrap_Succ(The_Part);
  11.            end if;
  12.           
  13.                      
  14.            The_Vector := Step_Of(Parts(The_Part).all, Current_Step);          
  15.           
  16.            Sheduler_Process.Receive(The_Vector, Current_step);                                                                            
  17.           
  18.           
  19.            if Current_Step + 1 > Step_Index_Type'Last then
  20.           Current_Step := 0;                    
  21.            end if;                                           
  22.  
  23.           
  24.           
  25.         end select;


 
Si vous avez du temps, s'il vous plaît ! Merci.

Reply

Marsh Posté le 18-10-2012 à 13:41:37   

Reply

Marsh Posté le 18-10-2012 à 14:04:55    

Ah, mais en plus ça résoud pas mon problème.
J'arrive pas a suivre ce que j'ai écrit. :/

Reply

Marsh Posté le 18-10-2012 à 16:42:31    

Un code qui marche, a priori celui qui va de soit. Je ne sais pas pourquoi ni comment je me suis mis à chercher ailleurs. :(  
 
 

Code :
  1. --
  2.            or
  3.            delay until Start_Time;
  4.            Start_Time := Start_Time + Quantum;
  5.            Clear(The_Vector);
  6.           
  7.            if (Current_Step mod Parts(The_Part).all'length) = 0 then
  8.              The_Part := Wrap_Succ(The_Part);
  9.            end if;
  10.           
  11.            The_Vector := Step_Of(Parts(The_Part).all, Current_Step);          
  12.           
  13.            Sheduler_Process.Receive(The_Vector, Current_Step);                                                                                       
  14.           
  15.            if Current_Step + 1 > Step_Index_Type'Last then
  16.           Current_Step := 1;                    
  17.            else
  18.           Current_Step := Current_Step + 1;
  19.            end if;                                                                 
  20.           
  21.         end select;


 
J'ai remplacé le litéral "32" par la variable ad'hoc, mais 'était pas ça je pense bref, mon problème semble résolu.
Je vais poursuivre les tests. Merci


Message édité par Profil supprimé le 18-10-2012 à 16:43:10
Reply

Marsh Posté le 18-10-2012 à 17:01:36    

Ben non enfait, ça marche toujour pas, je saute encore quelque chose.
Alors, je connais une soluce mais attention ça tache....
 
je peut déclarer une variable entre 1 et Parts(The_Part).all'length qui va suivre le (step_index mod (Parts(The_Part).all'length) et incrémenté The_Part quand la variable atteind Parts(The_Part).all'length. Ah, enfin, je crois.
 
Mais donc, ça tache un peut. Une soluce de votre côté ?
 
 
 

Reply

Marsh Posté le 18-10-2012 à 17:43:44    

Arf même avec ça, j'y arrive pas.
 
Bravo à celui qui trouve. Genre, une bise de jovalise.  [:jovalise:1]


Message édité par Profil supprimé le 18-10-2012 à 17:44:07
Reply

Marsh Posté le 18-10-2012 à 18:57:20    

Alors ... J'ai trouvé... Il y a l'ordre des start dans le main.
Mais aussi la fonction Step_Of à réviser pour renvoyer la bonne valeur lorsque step mod step_seq'length = 0.
Et j'ai simplement copier le test dans l'entré initialize dans le or delay de mon select.
 
Merci pour votre patience...

Reply

Marsh Posté le 18-10-2012 à 19:22:27    

Rho ! Ca coupe encore à la première rotation de step_index. Et c'est aléatoire parceque j'ai test et ça passait.
 
Bref.... Désolé.

Reply

Sujets relatifs:

Leave a Replay

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