1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
#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;<--- Variable 'tmp_ind' is assigned a value that is never used.
  //if(sred->data_usred != NULL && sred->data != 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;<--- Variable 'tmp_col' is assigned a value that is never used.
  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 *); //Выделение временного указателя
      if(*data_ptr != 0)
	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;<--- The scope of the variable 'tmp' can be reduced.
  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;
}