0

指定された時間の測定値を作成する測定器があります。この間、オーバーフローを防ぐために内部メモリから測定値をフェッチする必要があります。現在、私はこれを持っています:

public int FetchDatalog(int Time_s, double Period, out int Count, ref double[] Results)
{
    Count = 0;


    try
    {
        DateTime timeout = DateTime.UtcNow.AddSeconds(Time_s);
        double[] values;

        while (DateTime.UtcNow < timeout)
        {

        values = //here is the command to tell the instrument to return 10 results
        Count = values.Count();
        Thread.Sleep(500);
        //HERE IS SOMETHING MISSING <-----
        }

    }
    return 0;
}

そのため、指定された時間が経過するまで、ループで常に 10 個の結果を計測器から読み取る関数があります。ループ中に、読み取りデータをマージする必要があります。

矢印でマークされた位置で、10 個の値をマージし、最終的にすべてのマージされた値を結果に返すものが必要になりました。

不明な長さでこれを行うにはどうすればよいですか?

(追加の問題として:10の結果は「最大10」の結果になる可能性があります。10未満の場合もあるため、1つの値のみを読み取る必要がある場合はここでも変更できますが、これにより遅くなります。

助けてくれてありがとう


読みやすいようにここにコメントを追加しました - Sayse

私はマージを意味します:

loop1: values[]=1,2,3,4,5,6,7,8,9,0; 
loop2: values[]=11,22,33,44,55,66,77,88,99,11 
loop3: values[]=111,222,333,444,555,666,777,888,999,111 

この 3 つの値は、最終的に次のようにパラメーターの結果に返されます。

result[]=1,2,3,4,5,6,7,8,9,0,11,22,33,44,55,66,
     77,88,99,11,111,222,333,444,555,6‌​66,777,888,999,111

したがって、それらをまとめてより大きな配列にする必要があります。

4

1 に答える 1

1

何らかの理由で配列をパラメーターの型として維持する必要がある場合は、リストを作成してリストに追加し、結果を返すことができます。

public int FetchDatalog(int Time_s, double Period, out int Count, ref double[] Results)
{
    Count = 0;
    List<double> existing = new List<double>(Results);

    try
    {
        DateTime timeout = DateTime.UtcNow.AddSeconds(Time_s);
        double[] values;    
        while (DateTime.UtcNow < timeout)
        {
            values = //here is the command to tell the instrument to return 10 results
            Count += values.Length;
            Thread.Sleep(500);

            existing.AddRange(values);
        }    
    }
    finally 
    {
        Results = existing.ToArray();        
    }

    return 0;
}

私が自分のドラザーを持っていたら、それはもっと似ているでしょう:

public int FetchDatalog(int readLength, double sleepPeriod, List<double> results)
{
    var readingsCount = 0;
    try
    {
        var timeout = DateTime.UtcNow.AddSeconds(readLength);
        while (DateTime.UtcNow < timeout)
        {
            values = RetrieveBufferedSensorReadings(10);
            readingsCount += values.Length;
            results.AddRange(values);                
            Thread.Sleep(sleepPeriod);
        }
        return readingsCount;
    }
    catch (Exception e) //<-- this should be special purpose based on sleep/read failures
    {
       throw; //Return -1 or the like if you must... but ew.
    }
}

一般に悪いと考えられているasync4.0の新しい機能を使用することを検討することもできます。Thread.Sleep

編集:

最後のコメントに基づいて、これを行っているようです:

double[] Results = new double[100]; 
ret = GetData(TimeSec, out Count, ref Results);

これはお粗末な構造だと思いますが、学習ツールとして使用します。

public int GetData(int Time_s, out int Count, ref double[] Results)
{

    var lengthIncrement = 100;
    Count = 0;

    try
    {
        DateTime timeout = DateTime.UtcNow.AddSeconds(Time_s);
        double[] values;    
        while (DateTime.UtcNow < timeout)
        {
            values = //here is the command to tell the instrument to return 10 results

            //Before copying over value, make sure we won't overflow
            //If we will, extend array
            if (Count + values.Length > Results.Length) {
               var temp = new double[Results.Length + lengthIncrement];
               Array.Copy(Results, temp, Count);
               Results = temp;
            }                

            Array.Copy(values, 0, Results, Count, values.Length);
            Count += values.Length;
            Thread.Sleep(500);
        }    
    }

    return 0;
}

イデオンの例

他の多くの人が言っていることを繰り返しさせてください...以下ははるかに優れた設計です:

var results = new List<double>(); 
ret = GetData(TimeSec, out Count, results);
于 2013-09-18T14:37:42.440 に答える