[C] Algo pour trouver un sens d'incrément

Algo pour trouver un sens d'incrément [C] - Algo - Programmation

Marsh Posté le 27-11-2016 à 10:42:29    

Hello :hello:
 
Bon le titre n'est peut etre pas très explicite mais je n'ai pas trouvé mieux pour expliquer.
 
Je dois faire passer une variable d'une valeur à une autre en douceur. Cette variable peut etre situé entre 0 et 255.
Et j'aimerais trouver "le chemin le plus court" sachant que quand on arrive à 255 on repart à 0.
Par exemple:
- valeur d'origine 16. Valeur de destination 50 : alors incrément positif
- valeur d'origine 16. Valeur de destination 250: alors incrément négatif (pour passer par 0)
 
Et sauf à faire des tests dans tous les sens j'ai du mal à trouver une méthode simple pour connaitre le sens dans lequel faire varier ma variable.
 
Je programme en C de base (pour Arduino) mais je cherche surtout un algo général, j'adapterais ensuite à mes besoin
 
Merci pour votre aide :jap:


---------------
--== M4vr|ck ==--
Reply

Marsh Posté le 27-11-2016 à 10:42:29   

Reply

Marsh Posté le 27-11-2016 à 18:30:08    

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. int GetShortestDirIncrement( unsigned char from, unsigned char to )
  4. {
  5.   const int possibleIncrements[] = {1, -1};
  6.   int incrementId = from < to ? 0 : 1;
  7.   if ( abs((int)to - (int)from) > 127 )
  8.   {
  9.     incrementId ^= 1;
  10.   }
  11.   return possibleIncrements[ incrementId ];
  12. }
  13. void PrintExample( unsigned char from, unsigned char to )
  14. {
  15.   int increment = GetShortestDirIncrement( from, to );
  16.   printf( "From %03d - To %03d : increment = %d\n", from, to, increment );
  17. }
  18. int main( int argc, char** argv )
  19. {
  20.   PrintExample( 16, 50  ); // From  016 - To  050 : increment = 1
  21.   PrintExample( 16, 250 ); // From  016 - To  250 : increment = -1
  22.   PrintExample( 50, 16  ); // From  050 - To  016 : increment = -1
  23.   PrintExample( 250, 16 ); // From  250 - To  016 : increment = 1
  24.   return 0;
  25. }
 

Pour expliquer brièvement, tu as 4 cas basés sur deux critères.
 1/ ta valeur destination est supérieure à ta valeur de départ ou non
 2/ ta distance entre les deux est plus grande que la moitié de ton intervalle

 

J'ai choisi de partir sur l'idée que le 2/ va seulement consister à inverser la direction du résultat trouvé en 1/.
Donc sans surprise, je teste d'abord mon cas 1 pour trouver une direction, ensuite je teste mon cas 2/ pour l'inverser. Plutôt que de travaille directement sur l'incrément et de le retourner avec des multiplications par -1, j'ai préféré passer par un tableau et changer l'index entre les deux entrées possibles. A toi de voir ce qui te convient le mieux et si ton compilateur produit du meilleur code avec une autre approche :)


Message édité par theshockwave le 27-11-2016 à 18:39:26

---------------
last.fm
Reply

Marsh Posté le 01-12-2016 à 15:05:08    

Hello :hello:
 
Excuse moi, j'ai bien vu ta réponse mais je n'ai pas eu le temps de répondre tout de suite.
Je ne comprends pas exactement comment fonctionne le code de la fonction GetShortestDirIncrement (mes connaissances en C sont limitées) mais je vois bien le mécanisme global avec ton explication et ca correspond exactement à ce que je souhaite faire.
 
Une seule question: pourquoi utiliser des unsigned char en entrée de la fonction? Je n'aurais de mon coté que des byte (0-255).
C'est à cause de la ligne 7 ? la création de la variable incrementId.
 
merci :jap:


---------------
--== M4vr|ck ==--
Reply

Marsh Posté le 01-12-2016 à 19:32:43    

M4vrick a écrit :

Une seule question: pourquoi utiliser des unsigned char en entrée de la fonction? Je n'aurais de mon coté que des byte (0-255).

Un unsigned char c'est 0-255. ;) Le byte n'existe pas en C standard, ça doit être un truc spécifique au monde Arduino (ou autre).

Reply

Marsh Posté le 01-12-2016 à 20:33:12    

rat de combat a écrit :

Un unsigned char c'est 0-255. ;) Le byte n'existe pas en C standard, ça doit être un truc spécifique au monde Arduino (ou autre).


 
Ok, c'est l'équivalent en fait. Noté parfois Uint8_t comme en C je crois.
les char c'est plus utilisé pour les caractères dans le monde Arduino, même si c'est effectivement toujours un entier entre 0 et 255 :D
 
Merci pour la réponse :)


---------------
--== M4vr|ck ==--
Reply

Marsh Posté le 01-12-2016 à 20:50:34    

M4vrick a écrit :

Ok, c'est l'équivalent en fait. Noté parfois Uint8_t comme en C je crois.

Exact. Le problème avec les char, int et Co. c'est que la taille n'est pas toujours la même selon le système. C'est pour ça qu'on a introduit le stdint.h qui définit des tailles exactes genre uint8_t -> entier non signé de 8 bits.

Citation :

les char c'est plus utilisé pour les caractères dans le monde Arduino, même si c'est effectivement toujours un entier entre 0 et 255 :D

Attention, c'est 0-255 pour un unsigned char uniquement, sinon c'est -128 à (+)127. Et encore je crois que le standard dit que c'est au moins ça mais ça peut être plus. C'est assez embrouillant. :pt1cable:

Reply

Marsh Posté le 02-12-2016 à 16:52:55    

M4vrick a écrit :

Hello :hello:
 
Excuse moi, j'ai bien vu ta réponse mais je n'ai pas eu le temps de répondre tout de suite.
Je ne comprends pas exactement comment fonctionne le code de la fonction GetShortestDirIncrement (mes connaissances en C sont limitées) mais je vois bien le mécanisme global avec ton explication et ca correspond exactement à ce que je souhaite faire.
 
Une seule question: pourquoi utiliser des unsigned char en entrée de la fonction? Je n'aurais de mon coté que des byte (0-255).
C'est à cause de la ligne 7 ? la création de la variable incrementId.
 
merci :jap:

En fait, theshockwave a soumis une expression mathématique de

Code :
  1. int GetShortestDirIncrement( unsigned char From, unsigned char To )
  2. {
  3.     unsigned char Max, Min, Distance;
  4.     int Increment;
  5.     if( From <= To )
  6.     {
  7.         Max = To;
  8.         Min = From;
  9.         Increment = 1;
  10.     }
  11.     else
  12.     {
  13.         Max = From;
  14.         Min = To;
  15.         Increment = -1;
  16.     }
  17.     Distance = ( Max - Min );
  18.     Increment *= ( Distance * 2 <= 255 ) ? 1 : -1;
  19.     return( Increment );
  20. }

Reply

Marsh Posté le 02-12-2016 à 18:24:43    

Merci à vous deux pour les explications détaillées, c'est beaucoup plus clair maintenant :jap:


---------------
--== M4vr|ck ==--
Reply

Sujets relatifs:

Leave a Replay

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