Algo pour trouver un sens d'incrément [C] - Algo - Programmation
Marsh Posté le 27-11-2016 à 18:30:08
Code :
|
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
Marsh Posté le 01-12-2016 à 15:05:08
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
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).
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
Merci pour la réponse
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 |
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.
Marsh Posté le 02-12-2016 à 16:52:55
M4vrick a écrit : Hello |
En fait, theshockwave a soumis une expression mathématique de
Code :
|
Marsh Posté le 02-12-2016 à 18:24:43
Merci à vous deux pour les explications détaillées, c'est beaucoup plus clair maintenant
Marsh Posté le 27-11-2016 à 10:42:29
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
---------------
--== M4vr|ck ==--