Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2011, 15:35   #1
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию Произвольное число переменных произвольных типов

Моя программа должна каждую секунду принимать по сети пакет данных. Сколько полей в пакете, и каких они типов (Int16, Int32, Single, Double) - выясняется только при подключении.

Эти данные будут храниться в буфере.

Т. е. для хранения данных мне нужен объект, содержащий произвольное количество переменных произвольных типов.

Как можно реализовать это в C#?

Данных много, поэтому простой вариант с 4-мя разными переменными на все типы данных не подойдёт.

Последний раз редактировалось ds.Dante; 03.06.2011 в 15:39.
ds.Dante вне форума Ответить с цитированием
Старый 03.06.2011, 15:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Т. е. для хранения данных мне нужен объект, содержащий произвольное количество переменных произвольных типов.
зачем?! Ну получили Вы 10 Int16 и 20 Int32.. И что? Что Вы дальше с ними хотите делать?
Хранить - так как они приходят в пакете (вместе с заголовком, определяющим, как я понимаю, количество и тип полей) - так и сохраняйте. Бинарный буфер/файловый поток/файл...
не вижу в чём проблема...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.06.2011, 16:10   #3
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Приходят они в строке, что-то типа "42;5.5;0.0000001..."

Буфер хранит данные за несколько часов, и память нужно экономить.

К тому же при обновлении окна нужно быстро пройтись по всем данным (порядка десятков МБ в буфере), сделать выборку и построить несколько графиков.

Лучше как-нибудь сделать N массивов, каждый из которых имеет свой тип. Тогда выборка по каждому графику будет быстрее.
ds.Dante вне форума Ответить с цитированием
Старый 05.06.2011, 11:45   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я бы делал N списков, если потом предполагаются какие-то махинации с данными. А десятки МБ... Однозначно сбрасывать файл, хотя что за задача... Побольше бы конкретики.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 06.06.2011, 09:23   #5
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Программа каждую секунду получает данные с датчиков бурения скважины и обновляет графики.

График может быть как за последние 5 минут, так и за 5 часов, поэтому программа будет проходить по всему буферу, делая выборку тех точек, по которым строить графики (чтобы были видны все пики).

Чтобы всё было быстро, все данные нужно хранить в ОЗУ, причём сгруппированные по датчикам (массив для 1-го, для 2-го, и т. д.), а не по отсчётам (массив объектов, где каждый хранит инфу по всем датчикам за один момент времени).

Если бы я писал в C++, я просто рядом хранил бы тип параметра, а потом switch-ом выбирал бы ту или иную перегруженную функцию. Но мне казалось, что в таком языке как C# должно быть более простое решение.
ds.Dante вне форума Ответить с цитированием
Старый 06.06.2011, 16:26   #6
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Похоже, я нашёл, что искал - ArrayList. С ним можно провернуть такой фортель:

Код:
using System;
using System.Collections;

class Program
{
	static void Main ()
	{
		ArrayList heap = new ArrayList ();

		heap.Add (42);		// int
		heap.Add (36.6);	// double
		heap.Add ("foo");	// string

		foreach (object item in heap)
			Console.WriteLine (item);
		Console.ReadKey ();
	}
}
ds.Dante вне форума Ответить с цитированием
Старый 07.06.2011, 06:55   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Максимальной быстроты можно добиться если строить всякие графики сразу по мере поступления данных и сбрасывать их в файл... Скажем если тебе нужен график за сутки, то вряд ли понадобится 10 Мб...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 07.06.2011, 09:39   #8
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Шестичасовой (по умолчанию) буфер весит метров сорок.

Если пользователь крутанёт ролик мышки, то масштабирование с перерисовкой в реальном времени через файл не сделаешь.
ds.Dante вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по преобразованию типов переменных (TImage и FILE) Pcrepair Общие вопросы Delphi 3 04.01.2011 15:15
Преобразование типов переменных Guguzjaka Общие вопросы C/C++ 5 30.11.2009 18:45
Размер переменных базовых типов. Defa4ka Помощь студентам 2 06.09.2009 01:46
Значение типов переменных MAKEDON Общие вопросы Delphi 8 17.07.2008 11:24
Перевод переменных разных типов LeoN Общие вопросы Delphi 3 23.03.2007 00:15