#c# #arrays #textbox
#c# #массивы #текстовое поле
Вопрос:
Или кто-нибудь, кто объяснит, как это сделать, или направит меня к некоторым ресурсам. Вот информация о назначении:
dataCaptured: целочисленный массив — в этом поле будет храниться история ограниченного набора недавно полученных измерений. Как только массив заполнится, класс должен начать перезаписывать самые старые элементы, продолжая записывать самые новые записи. (Для этого вам могут понадобиться некоторые вспомогательные поля / переменные).
mostRecentMeasure: integer — в этом поле будет храниться самое последнее измерение, полученное для удобства отображения.
GetRawData. Возвращает содержимое dataCapturedarray. Какой элемент является самым старым в вашей истории? Вам нужно манипулировать этими значениями? Как они будут представлены пользователю?
Добавьте кнопку для отображения истории измерений (GetRawData). Где / как вы будете отображать этот список? Что вы заставили GetRawData() вернуть? Начинается ли список с самого старого собранного значения? Что происходит, когда ваш массив истории заполняется и старые значения перезаписываются? Что происходит, когда ваша история еще не заполнена? Считается ли «0» фактической записью истории? Отображается ли в вашей истории единицы, в которых были собраны данные?
Итак, я хочу передать весь массив в текстовое поле? Как мне это сделать? Атм, у меня действительно есть устройство и работает, и у меня есть текстовое поле, готовое для массива, я думаю. Может кто-нибудь направить меня к некоторым статьям о том, куда передать эту информацию? Спасибо за любую помощь.
в настоящее время у меня есть:
private double[] dataCaptured;
public double[] GetRawData()
{
return dataCaptured;
}
очень мало : (
Комментарии:
1. Вот несколько ключевых слов для поиска: очередь, стек, циклический буфер.
Ответ №1:
Я не собираюсь делать за вас домашнее задание, так что на самом деле это не ответ; это скорее учебное пособие.
Во-первых, проблема, которую вам назначили, является общей. Рассмотрим какой-то химический процесс. Вы создаете систему, которая периодически измеряет некоторый атрибут системы (скажем, температуру). В зависимости от характера процесса вы можете измерять его каждые 200 миллисекунд, каждые 2 секунды, каждые 2 минуты, что угодно. Но вы собираетесь делать это вечно. Вы хотите сохранить данные на некоторое время, но не навсегда — память в наши дни дешевая, но не настолько дешевая.
Итак, вы решили сохранить последние N измерений. Вы можете сохранить это в массиве из N элементов. Когда вы получаете первое измерение, вы помещаете его в 0-элемент массива, второе — в 1-элемент и так далее. Когда вы дойдете до N-го измерения, вы вставляете его в последний элемент. Но с (N 1)-м элементом у вас есть проблема. Решение состоит в том, чтобы поместить его в 0-элемент массива. Следующий элемент переходит в 1-элемент массива и так далее.
На этом этапе вам понадобится некоторая бухгалтерия. Вам нужно отслеживать, куда вы помещаете самый последний элемент. Вам также необходимо отслеживать, где находится самый старый элемент. Вам также нужен способ получить все измерения в некотором мягком временном порядке.
Это циклический буфер. Причина, по которой он циклический, заключается в том, что вы считаете 0, 1, 2…N-1, N, 0, 1, 2 и так далее, круг за кругом вечно.
Когда вы впервые начинаете заполнять буфер измерениями, самое старое находится в элементе-0, а самое последнее — там, где вы помещаете последнее измерение. Так продолжается до тех пор, пока вы не заполните буфер. Как только вы это сделаете, самый старый больше не будет равен 0, он находится в элементе логически после самого последнего (который является либо следующим элементом, либо, если вы находитесь в конце буфера, в позиции 0).
Вы можете отслеживать самые старые и самые новые индексы в массиве / буфере. Более простой способ — просто отслеживать, находитесь ли вы в начальной фазе «Еще не заполненный буфер» (логическое значение) и последний индекс. Самым старым является либо индекс 0 (если вы еще не заполнили буфер), либо логически следующий за самым новым. Таким образом, ведение бухгалтерского учета становится немного проще.
Для этого вам нужен способ найти следующий логический индекс в буфере (либо индекс 1, либо 0, если вы попали в конец буфера). Вам также нужен способ получить все данные (логически начать с индекса после текущей записи, а затем получить следующие N логических записей).
Кстати, я бы использовал float
, а не double
для отслеживания моих измерений. В общем, измерения сами по себе имеют достаточную погрешность, поэтому дополнительная точность, предлагаемая by double
, бесполезна. Уменьшив вдвое размер данных, вы можете увеличить свой буфер в два раза (это, кстати, учитывается в системе измерения и управления).
Для вашего источника измерений я бы изначально использовал генератор чисел, который начинается с 1.0f
to start и просто увеличивается с 1.0f
каждым циклом. Это значительно упростит отладку.
private float tempValue = 1.0f;
private float GetNextValue()
{
tempValue = 1.0f;
return tempValue;
}
Как только вы сделаете это по-настоящему, вам могут понадобиться случайные числа, что-то вроде:
private readonly Random _random = new Random();
private const float MinValue = 4.0f;
private const float MaxValue = 20.0f;
private float GetNextValue()
{
var nextRandom = _random.NextDouble();
var nextValue = (float) ((MaxValue - MinValue) * nextRandom MinValue);
return nextValue;
}
Кстати, выбор 4.0 и 20.0 является преднамеренным — google для «измерения 4 20».
Если вы хотите пофантазировать, сгенерируйте поток случайных чисел и пропустите его через сглаживающий фильтр (но это становится сложнее).
Вы спрашивали о том, как получить все значения в одном текстовом поле. Это должно сработать:
// concatenate a collection of float values (rendered with one decimal point)
// into a string (with some spaces separating the values)
private string FormatValuesAsString(IEnumerable<float> values)
{
var buffer = new StringBuilder();
foreach (var val in values)
{
buffer.Append($"{val:F1} ");
}
return buffer.ToString();
}
IEnumerable<float>
Представляет собой набор float
значений. Массив с плавающими значениями реализует этот интерфейс, как и практически любая другая коллекция с плавающими значениями (что означает, что вы можете поместить массив для этого параметра ( FormatValuesAsString(myArray)
). Вы также можете создать функцию, которая динамически генерирует значения (посмотрите вверх yield return
). FormatValuesAsString
Функция вернет строку, которую вы можете вставить в текстовое поле. Если вы будете делать это в каждом цикле вычисления, вы увидите, что ваши значения сдвигаются в текстовом поле.
Вы очень хорошо познакомитесь с отладчиком, выполняя это упражнение. Очень сложно сделать это правильно с первой, или двух, или трех, или … попыток (вы узнаете, почему программисты проклинают отдельные ошибки). Не сдавайтесь. Это хорошее назначение.
Наконец, если вы запутались, вы можете публиковать вопросы в качестве комментариев к этому ответу (в разумных пределах). Отметьте меня (чтобы убедиться, что я их вижу).