[C] utiliser une variable stockée dans un tableau après un certain délais

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, Je souhaiterais afficher dans un programme, la valeur qu’une variable a eu il y a un certains temps ( par exemple il y a 100 secondes) et ce toutes les 500ms. Pour cela je stocke toutes les valeurs de ma variable dans un tableau que voici:

float sortie_precedente[1000];//taille correspond a retard

puis après initialisation de mon tableau, je ressort les valeurs après le retard de cette façon:

  float tech=0.5;
  int retard = 100;
  affichage(tech,*sortie_precedente,retard);
  void affichage(float tech,float *sortie_precedente,int retard){
    sortie++;
    for(int i=(retard/(int) tech)-1;i>0;i--){
      sortie_precedente[i]=sortie_precedente[i-1];
    }
    sortie_precedente[0]=sortie;
    printf("sortie il y a 100 s = %d \n",sortie_precedente[retard-1]);
  }

Mais J’ai l’impression de me compliquer un peut la tâche et je ne suis pas sur que ce que je fait fonctionne correctement.

Pourriez vous m’indiquer si ce que je fait vous semble correct et si vous avez en tête une solution plus simple ?

Merci d’avance pour votre aide :)

Édité par Marty_and_Doc

+0 -0

Cette réponse a aidé l’auteur du sujet

Salut,

Utiliser un tableau me paraît judicieux, cela te permet de retrouver facilement la valeur au temps x étant donné que chaque case stocke une valeur prise toutes les 500 millisecondes. Le seul soucis se pose au niveau du stockage, mais peut se résoudre par exemple en bouclant une fois arrivé à la fin de ton tableau (c’est peut-être déjà ce que tu fais, mais je ne sais pas le dire avec seulement l’extrait que tu donnes).

Sinon, juste pour dire.

retard/(int) tech

Vu que tech vaut 0.5, là tu divises par zéro.

#JeSuisArius

+1 -0

Cette réponse a aidé l’auteur du sujet

Salut,

A priori ce que tu souhaites implémenter se rapproche d’un buffer circulaire.

Au lieu de garder l’indice d’écriture dans le tableau fixe et de décaler les autres valeurs afin de les conserver, ce serait plus performant de déplacer l’indice du tableau à chaque écriture, simplement la valeur retard devra être récupérée avant l’écriture car elle se trouve au même indice.

Tu auras à revenir à 0 quand tu auras atteint la fin du tableau, tu peux faire cela en une seule ligne:

indice = (indice+1)%taille;

Le temps d’exécution sera divisé par la taille du tableau.

Je te conseillerais également de faire 2 fonctions distinctes: lecture, écriture et de ne pas faire d’affichage dans ces fonctions. Car vraisemblablement au début tu feras une première phase de remplissage du tableau avec uniquement des écritures.

Édité par fromvega

+1 -0
Auteur du sujet

Salut,

Utiliser un tableau me paraît judicieux, cela te permet de retrouver facilement la valeur au temps x étant donné que chaque case stocke une valeur prise toutes les 500 millisecondes. Le seul soucis se pose au niveau du stockage, mais peut se résoudre par exemple en bouclant une fois arrivé à la fin de ton tableau (c’est peut-être déjà ce que tu fais, mais je ne sais pas le dire avec seulement l’extrait que tu donnes).

Sinon, juste pour dire.

retard/(int) tech

Vu que tech vaut 0.5, là tu divises par zéro.

Taurre

Bonjour, oui merci, je n’avais pas fait attention :)

Salut,

A priori ce que tu souhaites implémenter se rapproche d’un buffer circulaire.

Au lieu de garder l’indice d’écriture dans le tableau fixe et de décaler les autres valeurs afin de les conserver, ce serait plus performant de déplacer l’indice du tableau à chaque écriture, simplement la valeur retard devra être récupérée avant l’écriture car elle se trouve au même indice.

Tu auras à revenir à 0 quand tu auras atteint la fin du tableau, tu peux faire cela en une seule ligne:

indice = (indice+1)%taille;

Le temps d’exécution sera divisé par la taille du tableau.

Je te conseillerais également de faire 2 fonctions distinctes: lecture, écriture et de ne pas faire d’affichage dans ces fonctions. Car vraisemblablement au début tu feras une première phase de remplissage du tableau avec uniquement des écritures.

fromvega

Je ne savais pas que ça s’appelait un buffer circulaire, je te remercie je vais en profiter pour voir des exemples sur Internet. Merci également pour la technique afin de diminuer le temps d’exception, je vais modifier mon code pour réaliser une lecture et une écriture de cette façon :) .

Édité par Marty_and_Doc

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte