implémentation de c / c ++> RingBuffer (N marges)

Contrôle de fonctionnement


C++ Builder XE4

Dans le dessin graphique, les anciennes données ne rentrent pas dans la zone de dessin et ne sont pas nécessaires, je voulais donc un processus pour supprimer les anciennes données.

Il est facile d'utiliser TList, etc., mais j'ai moi-même implémenté le même processus afin qu'il puisse être utilisé dans des projets C.

En tant que processus

--keepnum: nombre minimum de données que vous souhaitez conserver --margin: nombre de données pour permettre la marge

Lorsque le nombre de données atteint (keepnum + margin), la marge est supprimée. En faisant cela, l'intention est que le processus de suppression de données puisse être exécuté à certains intervalles sans l'exécuter à chaque fois que des données sont ajoutées.

Corps de traitement


int TimeGraph_KeepLatestNsets(int keepnum, int margin, TG_graphData_t *graphDataPtr, int *dataCount)
{
	if (*dataCount < (keepnum + margin) ) {
		return *dataCount;
	}

	for(int idx = 0; idx < keepnum; idx++) {
		TG_graphData_t *src = &graphDataPtr[idx + margin];
		TG_graphData_t *dst = &graphDataPtr[idx];
		TimeGraph_SetEachData(dst, src->sampleDt, src->val, src->errStatus);
		// set 0 to moved one
		TimeGraph_SetEachData(src, src->sampleDt, 0.0, src->errStatus);
	}
	*dataCount = keepnum;

	return *dataCount;
}

Fonction de test


void Test_TimeGraph_KeepLatestNsets()
{
	TG_graphData_t data[10];
	int dataCnt = 0;

	const int keepnum= 5;
	const int margin = 3;

	for(int idx = 0; idx < (keepnum + margin); idx++) {
		if (idx < keepnum) {
			TimeGraph_SetEachData(&data[idx], Now(), 3.141592, TG_DATA_OK); 
		} else {
			TimeGraph_SetEachData(&data[idx], Now(), 2.7182, TG_DATA_OK); 		
		}
		dataCnt++;
	}

	int preCnt = dataCnt;
	int nowCnt = TimeGraph_KeepLatestNsets(keepnum, margin, &data[0], &dataCnt);
	if (preCnt != nowCnt) {
		// after removal of old data
		int nop551 = 1;
		(void) nop551; //Évitement de l'avertissement "La valeur affectée à xxx n'est pas utilisée"
	} else {
		int nop554 = 1;
		(void) nop554; //Évitement de l'avertissement "La valeur affectée à xxx n'est pas utilisée"
	}
}

TG_graphData_t est une structure de données. Il utilise une variable membre appelée TDateTime, mais lorsqu'elle est utilisée en C, elle sera remplacée par le type de données intégré le cas échéant.

TimeGraph_SetEachData(dst, src->sampleDt, src->val, src->errStatus); Définit les données après sampleDt dans la structure du pointeur dst. Ceci est fait pour éviter d'oublier d'attribuer certaines variables membres.

Il peut être préférable de reconsidérer un peu plus le nom de la variable.

Recommended Posts

implémentation de c / c ++> RingBuffer (N marges)
C> Séparation des chaînes séparées par des virgules> Implémentation de extractCsvRow ()
Implémentation de la séquence de Fibonacci
Implémentation informatique quantique de Quantum Walk 2
Implémentation de TF-IDF à l'aide de gensim
Implémentation de MathJax sur Sphinx
Progression de l'arrangement 5/6 ~ C etc. ~
Explication et mise en œuvre de SocialFoceModel
Mise en œuvre de la théorie des jeux - Le dilemme du prisonnier -
ARC067 C - Facteurs factoriels
Mise en œuvre d'une analyse de composants indépendante
Implémentation informatique quantique de Quantum Walk 3
Implémentation Python du filtre à particules
Déclaration des variables globales du langage C
Implémentation du tri rapide en Python
Implémentation informatique quantique de Quantum Walk 1
Apprentissage par renforcement profond 2 Mise en œuvre de l'apprentissage par renforcement
Implémentation de Scale-Space pour SIFT
L'implémentation C ++ de protobuf accélère le chargement du modèle Caffe de Chainer 10 fois
Géométrie> Calcul de l'angle horaire de deux vecteurs> Lien: implémentation python / implémentation C