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;
}
|