繁体   English   中英

关于项目的 arrays 的一些说明

[英]Some clarification about arrays for a project

或者有人解释如何执行此操作或指导我获取一些资源。 这是任务信息:

dataCaptured:integer 数组 - 该字段将存储一组有限的最近捕获的测量值的历史记录。 一旦阵列已满,class 应该开始覆盖最旧的元素,同时继续记录最新的捕获。 (您可能需要一些辅助字段/变量到 go)。

mostRecentMeasure: integer - 该字段将存储最近捕获的测量值以方便显示。

获取原始数据。 返回 dataCapture 数组的内容。 哪个元素是您历史上最古老的元素? 您需要操纵这些值吗? 它们将如何呈现给用户?

添加一个按钮以显示测量历史记录 (GetRawData)。 您将在哪里/如何显示此列表? 你让 GetRawData() 返回了什么? 列表是否从收集到的最早值开始? 当您的历史数组填满并且旧值被覆盖时会发生什么? 当您的历史记录尚未填满时会发生什么? “0”算作实际的历史条目吗? 您的历史记录是否显示收集数据的单位?

那么,我想将整个数组传递给文本框吗? 我怎么做? Atm,我确实已经启动并运行了设备,我想我已经为阵列准备了一个文本框。 有人可以指导我阅读一些关于将这些信息传递到哪里的文章吗? 谢谢你的帮助。

目前我有:

private double[] dataCaptured;
   public double[] GetRawData()
        {
            return dataCaptured;
        }

很少:(

我不会为你做功课,所以这不是真正的答案; 它更像是一个教程。

首先,分配给您的问题很常见。 考虑某种化学过程。 您构建了一个定期测量系统某些属性(例如温度)的系统。 根据过程的性质,您可以每 200 毫秒、每 2 秒、每 2 分钟等测量一次。 但是,你将永远这样做。 您希望将数据保留一段时间,但不是永远保留 - memory 这些天很便宜,但没那么便宜。

所以您决定保留最后 N 个测量值。 您可以将其保存在 N 元素数组中。 当您获得第一个测量值时,将其放在数组的 0 元素中,第二个放在 1 元素中,依此类推。 当你到达第 N 个测量值时,你将它放在最后一个元素中。 但是,对于第 (N+1) 个元素,您遇到了问题。 解决方案是将它放在数组的 0 元素中。 下一个进入数组的 1 元素,依此类推。

在这一点上,你需要一些簿记。 您需要跟踪放置最新元素的位置。 您还需要跟踪最旧元素的位置。 您还需要一种方法来以某种软时间顺序获取所有测量值。

这是一个循环缓冲区。 它是循环的原因是因为你数 0, 1, 2...N-1, N, 0, 1, 2 等等,一直循环下去。

当您第一次开始用测量值填充缓冲区时,最早的在 element-0 中,最新的在您放置最后一个测量值的位置。 它会一直这样,直到你填满缓冲区。 一旦你这样做了,那么最旧的就不再是 0,它在逻辑上位于最近的元素之后的元素(它是下一个元素,或者,如果你在缓冲区的末尾,则在 0 位置)。

您可以跟踪数组/缓冲区中最旧和最新的索引。 一种更简单的方法是只跟踪您是否处于初始尚未填充缓冲区阶段(布尔值)和最新索引。 最旧的是索引 0(如果您尚未填充缓冲区)或逻辑上位于最新索引之后的索引。 这样记账会容易一些。

为此,您需要一种方法来查找缓冲区中的下一个逻辑索引(如果您已到达缓冲区末尾,则为index+10 )。 您还需要一种获取所有数据的方法(从逻辑上当前条目之后的索引开始,然后获取下 N 个逻辑条目)。

顺便说一下,我会使用float而不是double来跟踪我的测量结果。 一般来说,测量本身有足够的误差, double精度提供的额外精度是没有用的。 通过将数据大小减半,您可以使缓冲区的长度增加一倍(顺便说一句,这是测量和控制系统中的一个考虑因素)。

对于您的测量源,我最初会使用一个从1.0f开始的数字生成器,并且每个周期只增加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 是有意为之的——谷歌搜索“4 20 测量”。

如果你想花哨一点,生成一个随机数 stream 并通过平滑滤波器运行它(但这会变得更复杂)。

您询问了如何将所有值放入一个文本框中。 这应该可以解决问题:

// 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) )。您还可以创建一个动态生成值的 function(查找yield returnFormatValuesAsString function 将返回一个字符串,您可以将其推入文本框。如果您在每个计算周期都这样做,您将看到您的值在文本框中移动。

通过这个练习,您将非常了解调试器。 在第一次、两次、三次或……尝试中很难做到这一点(您将了解为什么程序员会诅咒一个错误)。 不要放弃。 这是一个很好的任务。

最后,如果您感到困惑,可以将问题作为对此答案的评论发表(在合理范围内)。 标记我(以确保我看到它们)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM