前提・実現したいこと
現在C#を用いて「分割型配信チャネルの格納」というプログラムを作成しています.ユーザから要求されたチャネル(プログラム中では「ordered_channel」という名前の配列としている)の要素全体を同時にセグメント(「Segment」という名前の配列)に格納していき,セグメント内の空き領域がなくなると同じ大きさのセグメントを追加して同じ動作を繰り返すというものになります.ただし仮に最初のセグメントに格納しきれなかった「ordered_channel」の要素がある場合,それを1/2に分割し,その分割した分だけ追加したセグメントに納め,それが終わると残りを1/3, 1/4と分割して格納していきます.更に最初のセグメントに要素を格納し終えた時,そして分割された要素が格納された時に遅延時間「time_span」を計測します.下にプログラムで使われている変数の説明を載せました.
・i : 格納するセグメントの番地
・add_count : 新たなセグメントを追加した回数
・ordered_channel.Length : ユーザが要求するチャネル全体の長さ
・channel_size : キーボードから入力して要求するチャネル全体の長さ
・Segment.Length : 格納するセグメント全体の長さ
・StoreLimit : セグメントに格納できる要素の範囲.これを超えるとまだ格納されていない「ordered_channel」の要素が分割される.
・StoreLength : セグメントに現在格納されている要素の長さ(例外が発生している部分)
・RemainingSpace : セグメントの空き領域
・DivisionNumber : 何分の1に分割するかを示す変数.最初のセグメントに格納する際は分割しないので1として初期化されている.
要求されるチャネル「ordered_channel」の大きさが21以上になると例外が発生してしまうため,この問題を解決するにはどうすればいいのかアドバイスを頂けないでしょうか.
発生している問題・エラーメッセージ
下に載せているコード中の「StoreLength ++;」に例外がスローされていました.コメント文として「// * Out of Range」と書かれている箇所です.
System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'
該当のソースコード
C#
1// Simple Program for WHB scheme simulation 2// This program is made in C# language. 3 4using System; 5 6namespace Scheme_add 7{ 8 class Program 9 { 10 static void Main() 11 { 12 int add_count = 0; 13 int DivisionNumber = 2; 14 string[] Segment = new string[10]; 15 16 // Input maximum number of channels 17 Console.Write(" * maximum segment of number : "); 18 var channel_size = int.Parse(Console.ReadLine()); 19 20 var ordered_channel = new string[channel_size]; 21 22 int StoreLength = 0; 23 int RemainingSpace = Segment.Length - StoreLength; 24 int StoreLimit = Segment.Length; // divide into 1/1 (not divide) 25 26 DateTime start_time = DateTime.Now; 27 28 for (int i = 0; i <= ordered_channel.Length -1 ; i++) 29 { 30 // if segment and remaining space are filled out or unused ... 31 if(i == Segment.Length && StoreLimit > RemainingSpace) 32 { 33 // add segment (In fact, extend segments' length) 34 Array.Resize(ref Segment, Segment.Length + 10); 35 add_count++; 36 Console.WriteLine(" * scheme added"); 37 38 // measure time 39 DateTime end_time = DateTime.Now; 40 TimeSpan time_span = end_time - start_time; 41 Console.WriteLine(" * Time Lag [{0}] : {1}", i, time_span); 42 43 // update partition limit 44 StoreLimit = 1 / DivisionNumber; 45 } 46 47 // insert data to segment 48 Segment[i] = ordered_channel[i]; 49 StoreLength++; // * Out of Range 50 51 // update remaining space 52 RemainingSpace = Segment.Length - StoreLength; 53 54 } 55 Console.WriteLine(" * add_count : {0} ", add_count); 56 Console.ReadKey(); 57 } 58 } 59} 60 61// test result 62/* 63 * maximum segment of number : 20 64 * scheme added 65 * Time Lag [10] : 00:00:00.0031029 66 * add_count : 1 67 */ 68
末尾にある実行結果「test result」は例外が起きる手前(要求されたチャネルの大きさが20の時)を載せたものになります.
試したこと
例外がどういった時に発生するのか検証を行いました.その結果,「ordered_channel」の大きさが21以上になると発生することが分かりました.
補足情報(FW/ツールのバージョンなど)
私が用いているのはMicrosoft社の「Visual Studio 2019」になります.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。