usred

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

struct usred {
 double **data; //Указатель на массив текущих данных
 double *data_usred; //Указатель для массива усреднённых данных
 //double *data_accuracy; //Указатель на массив допустимых погрешностей
 unsigned long data_usred_col; //Количество переменных для усреднения
 unsigned long data_col; //Количество переменных для текущих данных
 unsigned long data_index; //Индекс массива текущих данных
 int data_redy; //Флаг готовности усреднённых данных
 //unsigned seconds_to_usred=0; //Временной интервал для усреднения
 //unsigned old_sec = 0;
};


int init_usred (struct usred *sred, unsigned long usred_ciclas,
 unsigned long args) { //Функция выделения массивов под данные и результаты усреднения
 unsigned long tmp_ind = 0;
 if(sred->data_usred != NULL) { //Проверка существования структуры
 fprintf(stderr, "[usred_init] Структура уже инициализированна.\n[usred_init] Повторная инецилизация не возможна!\n");
 return 2;
 }
 sred->data_usred_col = args; 
 sred->data_col = usred_ciclas;
 sred->data_index = 0; //Обнуление индекса
 sred->data_redy = 0; //Установление флага готовности в false
 sred->data_usred = malloc ((sred->data_usred_col + 1) * sizeof (double)); //Выделение памяти под усреднённые данные
 sred->data = malloc ((sred->data_col + 1) * sizeof (double *)); //Выделения массива указателей на массивы данных для усреднения, 1 изм
 if(sred->data == NULL || sred->data_usred == NULL) {
 fprintf(stderr, "[usred_init] Ошибка выделения памяти!");
 return 1;
 }
 unsigned long i, j;
 for (i = 0; i < (sred->data_col); i++) {
 sred->data[i] = malloc ((sred->data_usred_col + 1) * sizeof (double)); //Выделение памяти для массива данных для усред, 2 изм
 if(sred->data[i] == NULL) {
 fprintf(stderr, "[usred_init] Ошибка выделения памяти!");
 return 1;
 }
 }
 for (i = 0; i < (sred->data_usred_col); i++) { 
 for (j = 0; j < (sred->data_col); j++) {
 sred->data[j][i] = 0; //Обнуление массива данных для усреднения (для нормальной работы до полного заполнения)
 }
 sred->data_usred[i] = 0; //Обнуления массива для средних(чисто для приличия)
 }
 return 0;
}

int write_usred (struct usred *sred, int args, ...) //Функция внесения данных и возврата усреднённых на их место
{
 unsigned long i, tmp_col = 0;
 if(sred->data_usred == NULL) {
 fprintf(stderr,"[usred_write] Ошибка структура усреднения не инециализированна\n");
 return 3;
 }
 if (args > sred->data_usred_col) //Выход при превышение количества переменных для входа
 return 1;
 va_list ap; //Создание списка арг

 va_start (ap, args); //Начало разбора списка аргументов
 /*TODO:
 Сделать авто reloc при увеличение входных данных
 Сделать распознавание количества аргументов(через NULL ptr?..)*/
 for (i = 0; i < args; i++) {
 double *data_ptr = va_arg (ap, double *); //Выделение временного указателя
 sred->data[sred->data_index][i] = *data_ptr; //Запись данных в массив для усреднения
 if (sred->data_redy == 1 && *data_ptr != 0) //В случае готовности усреднённых данных
 *data_ptr = sred->data_usred[i]; //Вывод их на место входных
 }
 va_end (ap); //Окончание разбора аргументов

 unsigned long j;
 double tmp;
 for (i = 0; i < (sred->data_usred_col); i++) { //Проход алгоритмом усреднения по массиву i номер аргумента
 tmp = 0;
 for (j = 0; j < (sred->data_col); j++) { //Проход по подмассиву входных данных j индекс входных данных
 tmp += sred->data[j][i];
 }
 sred->data_usred[i] = tmp / sred->data_col; //Подсчёт среднего для i аргумента
 }
 sred->data_index++; //Увеличение индекса
 if ((sred->data_index + 1) > sred->data_col) { //В случае обнаружения окончания массива
 sred->data_index = 0; //Возврат индекса к 0 элементу для обеспечения цикличности
 sred->data_redy = 1; //Установления флага готовности данных в true
 }
}

void free_usred (struct usred *sred) { //Функция очистки памяти от структуры усреднения
 if(sred->data_usred == NULL) {
 fprintf(stderr, "[usred_free] Структура уже очищена!\n");
 return;}
 free (sred->data_usred); //Очистка массива усреднённых данных
 unsigned long i;
 for (i = 0; i < (sred->data_col); i++) { //Чистка массива усредняемых данных:
 free (sred->data[i]); //чистка массива аргументов
 }
 free (sred->data); //чистка массива указателей
 sred->data_usred = NULL;
 sred->data = NULL;
 sred->data_index = 0;
}

Вам может также понравиться...

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.