C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Oбработка информации, База данних или массив float?
namelos
  Отправлено: 08.02.2007, 23:45


Ученик-кочегар

Группа: Участник
Сообщений: 13



Доброго времени суток.
Задача построить график изменения температуры в течении отрезка времени мах 24 часа (думаю с помощью TChart). Температура снимается каждые 5секунд. Отрезок времени можно задавать(менять). Что посоветуете базу данных или массив?Или какие-нибудь другие идеи? Буду рад любой информации. Спасибо заранее.

Отредактировано namelos — 08.02.2007, 23:48
Valdemar
Отправлено: 09.02.2007, 08:48


Мастер участка

Группа: Участник
Сообщений: 433



Для хранения данных лучше использовать базу данных, а не массив. А график строить можно с помощью TChart или самостоятельно рисовать.
AVC
Отправлено: 09.02.2007, 09:12


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (namelos @ 08.02.2007, 22:45)
Доброго времени суток.
Задача построить график изменения температуры в течении отрезка времени мах 24 часа (думаю с помощью TChart). Температура снимается каждые 5секунд. Отрезок времени можно задавать(менять). Что посоветуете базу данных или массив?Или какие-нибудь другие идеи? Буду рад любой информации. Спасибо заранее.

Смотря что планируется делать дальше с этим рядом.
- Если просто показ графика, то можно ограничится и массивом
- Если только показ + истории предыдущих запусков приложения — файл подходящей структуры.
- А если что то серъезнее показа — то таблица БД.
namelos
Отправлено: 09.02.2007, 14:23


Ученик-кочегар

Группа: Участник
Сообщений: 13



Спасибо за советы. Как я понял, лучше воспользоваться массивом. К сожалению забыл уточнить, программа обработки температуры будет работать постоянно. Массив float у меня ограничен на 24 часа (замер каждые 5 сек = 17 280 членов), т.е. мне надо постоянно двигать на 1 все члены массива при каждой записи информации и это только для одного сенсора, а у меня их 8 (8x17280). Может кто подскажет как с мне лучше данные в массив записывать, а то Realtime графика может и не получиться.

Отредактировано namelos — 09.02.2007, 14:24
AVC
Отправлено: 09.02.2007, 15:03


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (namelos @ 09.02.2007, 13:23)
мне надо постоянно двигать на 1 все члены массива при каждой записи информации и это только для одного сенсора, а у меня их

???
Зачем двигать элементы массива когда достаточно изменять содержимое указателей. biggrin.gif

Добавлено.
Да. Для графика.
8 датчиков через 5сек — это не тот объем информации при котором стоит задумываться о времени на смещение.
И уж если станет совсем туго то можно забыть о том что это массив чего-то и поманипулировать памятью, занимаемой этим массивом. smile.gif Это будет очень быстро.

Прямо сию секунду посмотрел программу, которая снимает некие контрольные показания в асинхронном режиме и строит графики.
Данные храняться в текстовом файле и массиве.
На данный момент задействовано 10 каналов.
Для самого "жирного" число точек 1 089 232, размер файла 109M
Все замеры и сохранения и отрисовки графиков выполняются без заметных тормозов.

ps. Попутно эта же программа "звонит сеть" внешнюю и внутреннюю.
Машина самая обыкновенная, P4 2.2
nawok78
Отправлено: 09.02.2007, 15:44


Станционный диспетчер

Группа: Участник
Сообщений: 115



ну например:
CODE

#define ARRAY_SIZE 17280
static float *my_array;
.........
void refresh (folat newvalue)
{
foat *tmp = calloc (ARRAY_SIZE, sizeof(float));
memcpy(tmp, my_array+1, ARRAY_SIZE-1);
tmp[ARRAY_SIZE-1]=newvalue;
free my_array;
my_array=tmp;
}

разумеется my_array должен быть проинициирован в начале
CODE

void AfterStart()
{
my_array= calloc (ARRAY_SIZE, sizeof(float));
}

кстати calloc заполняет 0 выделяемую память smile.gif
namelos
Отправлено: 09.02.2007, 16:19


Ученик-кочегар

Группа: Участник
Сообщений: 13



QUOTE (AVC 09.02.2007 @ 09:12)
Зачем двигать элементы массива когда достаточно изменять содержимое указателей


Что-то я не очень понял по поводу указателей. Вот пример моего кода:


CODE

float temperature

float massive[1000];
int counter=0;

function(OnTimer)
{
  if (counter>999)
  {
     for(i=0;i<999;i++)massive[i]=massive[i+1];
     massive[999]=temperature;
  }
  else
  {
     massive[counter]=temperature;
     counter++;
  }
}

QUOTE (AVC 09.02.2007 @ 09:12)
поманипулировать памятью, занимаемой этим массивом


И еще уважаемый AVC, может по подробнее обьясните про манипулирование или ссылку дадите.
Спасибо заранее и хороших выходных. yahoo.gif

Отредактировано namelos — 09.02.2007, 16:54
namelos
Отправлено: 09.02.2007, 16:24


Ученик-кочегар

Группа: Участник
Сообщений: 13



Спасибо nawok78... yahoo.gif
AVC
Отправлено: 12.02.2007, 09:37


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (namelos @ 09.02.2007, 15:19)
может по подробнее обьясните про манипулирование или ссылку дадите.

Сцылка — пост nawok78 как вариант smile.gif
(Только зачем каждый раз память перезавхватывать? Можно работать в рамках исходного массива)
А лучше использовать stl.
nawok78
Отправлено: 12.02.2007, 09:51


Станционный диспетчер

Группа: Участник
Сообщений: 115



QUOTE
Можно работать в рамках исходного массива

типа:
CODE

#define ARRAY_SIZE 17280
static int current=0;
static float a[ARRAY_SIZE];

float readitem(int index)
{
return a[(index+current)%ARRAY_SIZE];
}

void newitem(float newValue)
{
a[(++current)%ARRAY_SIZE]=newValue;
}

void drowall ()
{
for (int i=0; i<ARRAY_SIZE; i++)
lineto(0, 0, 0, readitem(i)); // это абсолютно условно :) просто показал доступ к элементам массива
}


Отредактировано nawok78 — 12.02.2007, 09:52
AVC
Отправлено: 12.02.2007, 10:18


Ветеран

Группа: Модератор
Сообщений: 1583



2nawok78
Это вариант типа кардиографа. Текущая точка каждый раз в новом месте. Да?

Я имел ввиду сдвиг для освобождения элементов. Если массив расположен в едином блоке, то использование что то типа memcpy вместо for для сдвига части элементов может повысить скорость алгоритма.

2namelos
Еще раз, посмотрите в сторону stl.
nawok78
Отправлено: 12.02.2007, 11:03


Станционный диспетчер

Группа: Участник
Сообщений: 115



у меня как-то проблемы были с memcpy ...
помоему она не работает с пересеченными адресными пространствами..
ну т.е какраз сдвиги внутри куска памяти.

вроде memmove подходит для этого....

но когда у меня возникли проблемы этого не хватило пришлось делать как я до этого показывал — выделять новую память...
компилятор gcc — не помню уже версию (Mandrake 10)

весело было помню — писал классы на C smile.gif  — ООП форэва

а что-такое stl?
namelos
Отправлено: 13.02.2007, 01:31


Ученик-кочегар

Группа: Участник
Сообщений: 13



Спасибо за предложенные варианты, решил воспользоваться предложением Adilya, использовать массив TChart, намного проще так как функция delete() все и реализует. Вот пример кода.
CODE

#define MEMORY_SIZE 17200
counter=0;
Chart_TrendGraph->BottomAxis->AutomaticMinimum=true;
Chart_TrendGraph->BottomAxis->AutomaticМахimum=true;
OnTimer()
{

   if (Chart_TrendGraph->Series[i]->Count()<MEMORY_SIZE)                              
              Chart_TrendGraph->Series[i]->AddXY( Time(),sensor[i],"",clBlue);

     else
    {
        Chart_TrendGraph->Series[i]->Delete(0);
        Chart_TrendGraph->Series[i]->AddXY( Time() ,sensor[i],"",clBlue);
     }

  if(counter>1)
  {
    Chart_TrendGraph->BottomAxis->AutomaticMinimum=false;
    Chart_TrendGraph->BottomAxis->Minimum =Time()- EncodeTime(0,10,0,0);
  }
  else counter++;
}

Работает, правда, почему-то выдает ошибку,что min должен быть <= max, если я ввожу минимум сразу, поэтому приходится вводить min только на следующий раз.В чем причина не могу понять?
И вообще какой-то странный bug иногда выскакивает и наследующий раз, увеличил условие до 2х проходов таймера( if(counter>1)), теперь как будто не вылазит. Что скажете господа-профессионалы?

Отредактировано namelos — 13.02.2007, 12:05

Вернуться в Вопросы программирования в C++Builder