配列のオフセットおよび長さが範囲を超えているエラーの原因とASP.NETでのメモリ保持方法

このQ&Aのポイント
  • C#のASP.NETで配列のオフセットおよび長さが範囲を超えているエラーが発生する理由について解説します。
  • ASP.NETでメモリ上にデータを保持する方法はstatic以外にもありますか?詳細を説明します。
  • 要約文3
回答を見る
  • ベストアンサー

配列のオフセットおよび長さが範囲を超えている

C#のASP.NETで運用していますが、 static SortedListを使って、メモリに保持しておいて、 レスポンスを早くするようにしていますが、 if (_SortedList.ContainsKey(str)) return (ArrayList)_SortedList[str]; とデータを取得しようとすると、 なぜかインデックスが重複しているわけでもないのに、 「配列のオフセットおよび長さが範囲を超えているか、カウンタがソース コレクションのインデックスから最後までの要素の数より大きい値です。」 とエラーが発生します。 なぜエラーとなるのでしょうか? またASP.NETでメモリ上に保持する方法は static以外にあるのでしょうか?

  • ENTRE
  • お礼率0% (16/2523)

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

ASP.NETにはそれほど詳しいわけではありませんが。 sortedList.itemで出る例外はこちら http://msdn.microsoft.com/ja-jp/library/system.collections.sortedlist.item%28v=vs.80%29.aspx ArrayListのものはこちら http://msdn.microsoft.com/ja-jp/library/system.collections.arraylist.item%28v=vs.80%29.aspx メッセージからして、ArgumentOutOfRangeException が発生しているように見えます http://msdn.microsoft.com/ja-jp/library/system.argumentoutofrangeexception%28v=vs.80%29.aspx これはSortedList.Itemでは発生しません。 なので、 (ArrayList)_SortedList[str] が返っていった先での使い方に問題があるように思います。

関連するQ&A

  • 配列・クリア

    かなり初歩的な質問です。 あるBeanで public static String lst_data[][] = new String[5][14]; という配列を宣言してます。 処理のなかで、 lst_data = str_data; clrPara(); としています。str_data配列をlst_dataに セットしているんですが、 clrPara()のなかで、str_dataをクリアにする 処理を行っています。 そうすると、lst_dataに一旦セットされたものが str_dataのクリアで、lst_dataもクリアされて しまっているようです。 lst_dataの値は保持するにはどのようにしたらいいので しょうか??

    • ベストアンサー
    • Java
  • ArrayListを使った多次元配列の作成について

    ArrayListで可変長配列を扱っているのですが、 2次元可変長配列を用いる必要が出てきたので、 下記のように変更したのですがうまくいきません。 何が悪いのか教えていただけませんでしょうか? ----------------------------------------- ArrayList cars=new ArrayList(); cars.add("フェラーリ"); cars.add("ポルシェ"); cars.add("メルセデスベンツ"); for(int i=0;i<cars.size();i++){  String str=(String)cars.get(i);  System.out.println(str);} ----------------------------------------- 上記から下記のように変更しました。 ----------------------------------------- ArrayList[] cars=new ArrayList[3]; cars[0].add("フェラーリ"); cars[0].add("ポルシェ"); cars[0].add("メルセデスベンツ"); for(int i=0;i<cars[0].size();i++){  String str=(String)cars[0].get(i);  System.out.println(str);} ----------------------------------------- エラーは「Exception in thread "main" java.lang.NullPointerException」です。 どうやら初期配列が10ではなく3となってしまっているようです。

    • ベストアンサー
    • Java
  • 配列のサイズをrealloc的に変更するには?

    タイトルの通り配列のサイズを動的に変更することを考えています。 http://www-06.ibm.com/jp/developerworks/java/030808/j_j-dyn0603.html に一発拡張メソッドが載っていますが、私が望むのはCのrealloc的な方法で、メモリ領域を新たに確保して既存データをコピーするのではなく、なるべく利用中のメモリの拡張を試みることは出来るのかという疑問です。 保持するデータはfloat型で、カナリ激しく計算を行います。なのでArrayList<Double> 等による保持方法は考えていません。 Javaでオーバーヘッドが少ない配列の拡張方法ってあるのでしょうか?

    • ベストアンサー
    • Java
  • ReDim Preserveできなかった配列をUBOUND……

    VBScriptでプログラムを組んでおります。 初心者なので言葉の使い方が間違っているかもしれませんがご容赦ください。 ASPでDBにアクセスして、このときにReDim Preserveを使って配列(str)を動的に拡張しながらDBから項目を抽出しています。 この動的に作った配列の項目を表示する際にどうしても項目数が必要なので UBound(str)で要素数を抜き出して使用しています。 DBにデータがあれば問題ないのですが、DBにデータがない場合はUBound(str)実行時に -------------------------- Microsoft VBScript 実行時エラー (0x800A0009) インデックスが有効範囲にありません。: 'ubound' -------------------------- と表示されてしまいます。 これを回避するにはDBから1つの項目を抽出する度に+1するような変数を作れば事足りるとは思いますが、 そうすると配列内の項目を表示する関数の引数を増やすことになり、少し納得がいきません。 Dim str() において Redim str(1)をしたかしてないかを見分ける方法を教えてくださいませんか。 ……無ければ「無い」と仰ってくれれば助かります。 では失礼します。 お時間があればご協力宜しくお願いします。

  • C#で、引数における一次元と二次元配列の取り扱い

    C#について質問させていただきます。 以下のようにすればそれぞれ一次元配列と二次元配列を格納出来ますが 同時に一つの引数に収めることは無理なのでしょうか?    public static void Join(string[] Ary_str){ 本文 }    public static void Join(string[ , ] Ary_str){ 本文 } そのために、例えば以下のようにしたとします。    public static void Join(object Ary_obj){ 本文 } こうすれば一次元でも二次元でも格納出来ますが 格納された値が何次元配列なのか確認するために    Ary_obj.Rank としてもエラーになってしまいます。 (1)Objectに格納した値が何次元配列なのか確認する方法か (2)一次元でも二次元でも格納できる引数の指定方法 をご存じの方、ぜひお教え願います。><

  • ASPでサーバーサイドの配列をクライアントサイドへ引渡し

    表記の件の実装方法が分からず、非常に困っています。 どなたかご教授願います。 ■開発環境   ASP(VBScript) ■内容   サーバーサイドでDBから取得した内容を   配列に保持しているのですが、その内容をクライアントサイド処理で   取得したいのですが、どのようにすればいいのか分かりません。   サーバーサイドの配列名 arrSvr() とした場合、   "<%=arrSvr(1)%>"などとすれば取得は出来るのですが、   配列のインデックスを動的に変更して取得したいのですがうまく行きません。   "<%=arrSvr(" & i & ")%>"などとしてもエラーとなってしましますし、   クライアントサイドの配列に一度配列ごと突っ込もうとして   arrClt = "<%=arrSvr%>" のようにしてもダメでした。   どなたか詳しい方、どうぞよろしくお願いします。

  • コレクションクラスの使い分け方

    プログラミング初心者です。 コレクションクラスについて勉強中ですが、 1:ArrayListクラス(Listインターフェース) 2:HashSetクラス(Setインターフェース) 3:HashMapクラス(Mapインターフェース) 4:Vectorクラス 5:Iteratorインターフェース これらの違いがよく分かりません。 <質問1> 1と2の違いは、 1:順序付けて、重複オブジェクトを保持する 2:順不同で一意のオブジェクトを保持する というところまでは分かりました。 これらと3・4の違いって何でしょうか? <質問2> 5:ポインタを前後に動かすような感じで、保持したコレクションの中身を操作できる、 ということだと思いました。 1~4まででも、要素(インデックス)を指定しれやれば、中身を操作することはできると思うのですが、これを使ったほうがどのように便利なのでしょうか? 初歩的な質問で申し訳ありませんが、具体例などを示して教えていただければ助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • C#での動的配列作成方法について

    はじめまして、 現在ASP.NET、C#で開発をしております。 そこで、質問です。 C#で二次元配列を作成し、データを格納します。 二次元配列は宣言時はサイズがわかってません。 ループで回った回数分、最初(第一要素数)の要素数が決定します。 二つ目の要素数の数は最初からきまっています(固定用素数)。 string[][] string[,] arraylist などがあると思いますが、上記の場合どういう風に配列を作成していったらいいのでしょうか? 動的にサイズを変更できる配列の作り方、データ格納方法、データ表示方法を教えてください。 よろしくお願いします。

  • VBScripの2次元動的配列

    下記VBScripサンプルで2次元動的配列をつかっているのですが redim preserveでエラになります。 (インデックスが有効範囲にありません) 原因をご伝授ください。 環境 IIS 5.0 Windows XP index.asp <%@ LANGUAGE="VBScript" %> <% 'option explicit %> <!-- #include file="test.asp" --> <% Dim Order() Dim dat() call test(Order,dat) response.write("dat=" & dat(1,2)) %> test.asp <%'Option Explicit%> <% function test(Order_info,dat) Dim i redim dat(0,7) for i=0 to 1 <- iが0の時はOK,iが1になるとエラー redim preserve dat(i,7) dat(i,1)="1" dat(i,2)="2" dat(i,3)="3" dat(i,4)="4" dat(i,5)="5" dat(i,6)="6" next End function

  • ASPのReDim Preserveについて

    いつもお世話になります。 ASP(VBScript)で教えて頂きたいことがあります。 VBScriptにはJavaでいうArrayListのようなコレクション機能がないので、動的配列を実現するためには ReDim PreserveやScripting.Dictionaryを使用しなければなりませんよね。 そこで、DBから取得したレコードを、ループする度毎にReDim Preserveを使用し、データをセットするよう な実装をしていました。すると、ReDim Preserveは問題があるのでやめた方がよい、と言われました。 具体的には、ReDim Preserveをすることによって、新たに配列を作成し、古い内容をコピーするため、 倍々にメモリを食いつぶしていくことになり、それが大きくなるとどんどん遅くなっていき、そしてメモリリーク になる、ということでした。 自分なりに調べてみたのですが、そのような記事を見つけることができませんでしたし、JavaのArrayList でも内部的には配列を持っており、配列の再作成などをやっています。 ○○百万件などといった大量件数を扱う際は、それはメモリリークにならないような設計、実装をしなければ ならないとは思うのですが、それはどの言語でも共通で言えることであって、特別にVBScriptではやめた方がよい、 とは思えません。 ReDim Preserveを使用しても、先に述べたような認識をもっていれば問題ないと思うのですが、どうでしょうか。 VBScriptは、こういう仕組みだから駄目なんだ、という理由があるのでしょうか。もしあれば、根拠となる サイトなど教えて頂けると嬉しいのですが。。。 宜しくお願い致します。