質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

4回答

1054閲覧

要求される配列の要素を別の配列に格納していく際,要求される配列の大きさがある一定値を超えると例外が発生するため,解決方法を教えて頂きたいです.

pamu

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2019/10/24 07:10

前提・実現したいこと

現在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」になります.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Debugしたらわかると思いますが2回目のここに入らないからでしょう。

C#

1// add segment (In fact, extend segments' length) 2Array.Resize(ref Segment, Segment.Length + 10);

投稿2019/10/24 07:44

workaholist

総合スコア559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

配列が拡張されているか確認されてはどうでしょうか?
Array.Resizeの部分にでもブレイクポイントを置くなどしてデバッガにていろいろ確認してみてください。

投稿2019/10/24 07:44

YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pamu

2019/10/28 05:07

返信が遅くなり申し訳ありません.今現在Array.Resizeの行とadd_count++;の間にデバッグ用にSegment.Lengthの値を出力するコードを追加して確認しましたが,値が20のままであることが分かりました.Array.Resizeではなく,新たな配列を示す変数を宣言してArray.Copyを用いて移すやり方を試してみます.
YAmaGNZ

2019/10/28 05:30

1行づつステップ実行して、各変数が期待通りに変化するか確認されましたか? Array.Resizeが行われていないのが原因でしょうから、何故実行されないか確認しましょう。 StoreLimitやRemainingSpaceも期待通りの値なのか確認してください。
guest

0

配列が拡張されないのは、if文内のStoreLimitを再計算しているところで「1 / DivisionNumber」(サンプルコードで計算すると0.5)を代入しているので、整数型のStoreLimitには格納できず「0」となってしまうことが原因だと思います。ちょっと質問文からどういったことがやりたいのか理解しきれなかったので、何を代入するのが正しいのかはわかりかねます。申し訳ありません。

投稿2019/10/28 14:41

Gurz1019_MP

総合スコア196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

配列の範囲を超えてアクセスしている、というエラーです
範囲を超えないようにしましょう

#エラーが出たときのiの値をチェックしてみましょう

投稿2019/10/24 07:28

編集2019/10/24 07:39
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pamu

2019/10/28 02:23

返信が遅くなり申し訳ありません.Array.Resizeの行にブレイクポイントを仕掛けてデバッグを行ったところ,どのような値を入力しても必ずiの値は10になることが分かりました.if文の中身に問題がありそうなのでそこを修正していきます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問