Décalage dans un tableau

Résolu/Fermé
swaks - 24 avril 2014 à 13:20
 Utilisateur anonyme - 24 avril 2014 à 22:30
Bonjour,

Voila je vous expose mon problème.

Je fait un programme qui stocke des donnés reçut sur un banc CAN mais la n'est pas le probleme je souhaiterai inserer ces valeur dans un tableau le tableau est constituer de 10 case.

Exemple je recoit 0x280 je le stocke dans le premiere case ensuite je recoit 0x420 je le stocke dans la deuxieme case et ainsi de suite le probleme c est que le 11 eme message message doit arriver dans la case 11 et supprimer la case 0 donc je doit faire un décalage vers la gauche de toute les valeurs de mon tableau si quelqun aurait une Idée ce serai cool ^^ merci d'avance

A voir également:

5 réponses

le probleme c est que je doit afficher le message apres et permettre d afficher les messages precedent et suivant
2
fiddy
Messages postés
11067
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 808
24 avril 2014 à 14:49
Ben, tu les auras tes messages précédents :
A droite de la case : les anciennes valeurs.
A gauche, les nouvelles valeurs.

En revanche, avec le décalage tu perds tout.
Ou alors dis-nous ce que tu entends par décalage.
Par exemple, tu as : 1 2 3 4 5 6 7 8 9 10
Après avoir mis le 11, tu voudrais que le tableau soit écrit comment ?
1
fiddy
Messages postés
11067
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 808
24 avril 2014 à 14:02
Bonjour,

Il y a beaucoup plus simple et performant que faire un décalage à gauche de toutes les valeurs.
Il suffit d'utiliser le modulo. Tu stockes le ième élément à la case (i-1)%10.
Par exemple, le premier, tu le stockes dans la case (1-1)%10 => 0.
...
Le 11ème, tu le stockes dans la case (11-1)%10 => 0
Etc.

Cdlt,
-
Google is your friend
0
2 3 4 5 6 7 8 9 10 11

J avait pensé cree un autre tableau et copier les tableau entre eux mais c'est laborieux ... doit y avoir plus simple
0
fiddy
Messages postés
11067
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 808
Modifié par fiddy le 24/04/2014 à 16:17
Ah ok. Je n'étais pas parti sur ce décalage :-).
Effectivement, il y a plus simple.
Il suffit d'une variable tmp.
L'algorithme peut être :

Pour i de 1 à 10 Faire
tmp[i-1]<-tmp[i]
FinPour

tmp[9] <- NouvelleValeur

Cdlt,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
24 avril 2014 à 17:09
Bonjour

memmove ( &tmp[0], &tmp[1] , 9*sizeof(tmp[0]));
fait le décalage en une seule instruction.
0
fiddy
Messages postés
11067
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 808
Modifié par fiddy le 24/04/2014 à 17:32
Bien vu :-).
D'ailleurs, ce n'est pas tmp, mais tab que je voulais mettre. La variable tmp n'étant pas nécessaire.
memmove ( tab, tab+1 , 9*sizeof *tab);
0
merci beaucoups :D
0
Utilisateur anonyme
24 avril 2014 à 21:30
tab et tab+1 au lieu de &tab[0] et &tab[1] : je ne pratique pas le C, je n'ai pas les bons réflexes.
Le 9 * sizeof * tab, j'ai mis du temps à comprendre que le deuxième * n'était pas de même nature que le premier. J'ai failli te demander si tu étais sûr de toi.
0
fiddy
Messages postés
11067
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 808
24 avril 2014 à 22:07
Rassure-toi le père. tab ou &tab[0], c'est la même chose. Juste que tab fait plus C ;-).
Pour le 9*sizeof *tab, la syntaxe est effectivement importante pour ne pas nuire à la lisibilité. 9 * sizeof * tab; c'est tout de suite moins joli :-).
0
Utilisateur anonyme
24 avril 2014 à 22:30
tab ou &tab[0], c'est la même chose
Je sais bien, c'est pour ça que je dis que je n'ai pas les bons réflexes. Mon écriture était lourde, quoique peut-être (?) plus facile à comprendre.
0