Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
995 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2292814
M4vrick
Mad user
Posté le 27-11-2016 à 10:42:29  profilanswer
 

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 ==--
mood
Publicité
Posté le 27-11-2016 à 10:42:29  profilanswer
 

n°2292835
theshockwa​ve
I work at a firm named Koslow
Posté le 27-11-2016 à 18:30:08  profilanswer
 

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
n°2293079
M4vrick
Mad user
Posté le 01-12-2016 à 15:05:08  profilanswer
 

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 ==--
n°2293108
rat de com​bat
attention rongeur méchant!
Posté le 01-12-2016 à 19:32:43  profilanswer
 

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).

n°2293119
M4vrick
Mad user
Posté le 01-12-2016 à 20:33:12  profilanswer
 

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 ==--
n°2293121
rat de com​bat
attention rongeur méchant!
Posté le 01-12-2016 à 20:50:34  profilanswer
 

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:

n°2293168
benriach
Posté le 02-12-2016 à 16:52:55  profilanswer
 

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. }

n°2293173
M4vrick
Mad user
Posté le 02-12-2016 à 18:24:43  profilanswer
 

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


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

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

 

Sujets relatifs
[Résolu] Mettre à jour/ajouter éléments dans un XML en C#coment faire tourner un borland C++ sur windoiws10
C program from dedicated linux server[C#/HTML] Formater un email via HTML
Simplifier une ligne de push_back (string) répétitifsDonner des cours pour Les TD et TP en C
[ C ] - Question sur les tableaux de pointeursVerifier l'état de la fenêtre d'un exe en C #
Macro word : trouver format et ajouter balises htmlRevenir au C
Plus de sujets relatifs à : [C] Algo pour trouver un sens d'incrément


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR