• ベストアンサー

Listクラスについて

 こんにちは。いつもお世話になっております。  プログラミングの初心者で、現在VC++でプログラムを作成しています。環境は、OSがWindowsXP、統合環境はVisualStudio2008 Professionalを使用しています。  プログラムの中で配列の代わりにListクラスを使いたいのですが、Listのインデックスを指定して値を代入することができません。MSDNではinsertメソッドでインデックスを指定して挿入ができるように書かれているのですが・・・・・。リストは整数を格納するためのもので、 List<int>^ zangakuList; と、宣言してメソッドの中では、 zangakuList->Insert(i, item->Money); のように使用しています。ちなみに、iの代わりに0を設定するとリストの先頭に値が代入されます。  お手数ですが、原因がお分かりの方、よろしくご教授ください。m(_)m

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8525/19379)
回答No.2

リストの末尾に順に足すだけなら zangakuList->Insert(i, item->Money); ではなく zangakuList->Add(item->Money); を使いなさい。 Insertは、リストの先頭に挿入するとか、リストの途中に挿入するなど、末尾以外に挿入する場合のみに使う。 なお for (i = 0; i < 20; i++) {    if(banknary[i] == item->Bankn)   {      zangakuList->Insert(i, item->Money);   (ここでエラーが発生)  break;    } } と言うプログラムは、iがzangakuList->Countより大きい状態でiの位置にInsertしようとするので、ほぼ間違い無く例外が発生する。 例えば、zangakuListが空でスタートし、iが0の時にbanknary[i] == item->Banknが成り立たない場合、Insertが実行されず、zangakuListが空のままになる。 次のループに入り、iが1の時にbanknary[i] == item->Banknが成り立つと、Insertを実行しようとするが、zangakuListが空なので、Insertが許されるのは0の位置のみである。 しかしzangakuList->Insert(i, item->Money);のiは1になっているので「Insertメソッドの第1引数『index』が範囲外である」と言うエラーとなる。 ListのInsertメソッドの第1引数Indexに許されるのは「0以上、Countメンバ以下」である。空のリストは「Countが0」であるので「0以上、0以下」つまり「0」しか許されない。 プログラムを以下のように修正せよ。 for (i = 0; i < 20; i++) {    if(banknary[i] == item->Bankn)   {      zangakuList->Add(item->Money);      break;    } } または for (i = 0; i < 20; i++) {    if(banknary[i] == item->Bankn)   {      zangakuList->Insert(zangakuList->Count,item->Money);      break;    } } ぶっちゃけ zangakuList->Insert(zangakuList->Count,item->Money); は馬鹿臭い。zangakuList->Countを引数にしてInsertする必要はなく zangakuList->Add(item->Money); で充分である。

watataku70
質問者

お礼

 chie65535さん、こんにちは。回答ありがとうございました。御礼が遅くなり申し訳ありません。  教えて頂いた様に、ListオブジェクトにAddしていくやり方でうまくいきました。分かりやすい回答本当にありがとうございました。m(_)m

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どのようなコードをお書きになって期待する実行結果と実際の結果にどのような違いがあるのでしょう 全く何も登録されていない ListオブジェクトにInsertメソッドをつかって要素を追加しようとしているのでしょうか 何か例外(エラー)が発生しているのであればその内容も明示しましょう

watataku70
質問者

補足

 こんにちは、redfox63さん。早速の回答ありがとうございました。m(_)m  ご指摘の通り、何も登録されていないListオブジェクトにInsertメソッドを使って要素を追加しようとしています。また、プログラムの実行の際に、 「ArgumentOutOfRangeExceptionはハンドルされませんでした。インデックスは一覧の範囲内になければなりません。パラメータ名: index」というエラーが表示されます。実際のコードは以下のようなものです。 ***** Listオブジェクトを作成 ***** zangakuList = gcnew List<int>(20); ***** 条件に合致した場合、Listオブジェクトに要素を追加 ***** for (i = 0; i < 20; i++) {    if(banknary[i] == item->Bankn)   {      zangakuList->Insert(i, item->Money);   (ここでエラーが発生)  break;    } }

関連するQ&A

  • STL関数listの中に作ったclassへのアクセス方法

    c++でSTLのlistを使いクラスをリスト化しようと考えて以下のようなプログラムを作りました.以下のプログラムはビルドは出来、実行できたため値は代入出来てると思うのですが, coutによって"zzの任意の番号(例えば3)の値を調べようと思ったとき,どのように書いていいのか,色々調べたり,実行したりしても分からなかったので,教えて下さい. ちなみに、このプログラムは数学での(x,y)座標の値を代入していくプログラムをイメージして作っています. #include <list> #include <iostream> using namespace std; class Coordinates { public: double x; double y; }; int main() { list<Coordinates> zz; Coordinates xy; for(int i=0; i<5; i++) { xy.x = i; xy.y = i; zz.push_back(xy); } }

  • idから名称を取ったり、名称からidを取るクラス

    idと値を持ったリストがあります 例えば 100 りんご 200 みかん 300 バナナ といった具合です。 この時、インデックス0の、item(0) item(1) でコード100 値りんご は取れると思いますが、 インデックスをベースに探すのではなく、 「コード100の値は何か?」や「りんごのコードは何か?」を取得したいです。 今はhashtableなどを、index 0 からindexの最後までをループ処理で検索する処理で実現していますが、最初からそういうメソッドを持ったクラスはないものでしょうか?

  • クラスやメソッドが理解できません

    今javaを勉強中なのですが、クラスやメソッドで生きず待ってしまいました。 メソッドの定義は 戻り値の型 メソッド名(引数リスト) {  文;  ・・・ return 式;  } ですが、メソッドから返されえる値を戻り値といますよね?呼び出し元に値を返すってどういうことなのでしょうか? int getNum() { System.out.println("調べました") return num; } たとえば、上記のようなものですが。もしも、このメソッドを呼び出すと、”戻り値”が戻ってくるわけですが、これはgetNumという変数のなかに計算式が入っている?という考え方でいいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • List<DataClass>からデータ抽出

    javaでプログラミングを始めたのですが、人のプログラムを読んでいてわからない所があります。 まずデータクラスとして「GPSData」があり、これは2つの値のsetterとgetterを持っています。 public class GpsData { private float lat; private float lon; public float getLat() {return lat;} public void setLat(float lat) {this.id = lat;} public float getLon() {return lon;} public void setLon(float lon) {this.id = lon;} } GPSDaoというクラスがselectAllというメソッドを持っており、これはDBのGPSテーブルの値を取得し、List<GPSData>を返します。 以下のようにまずはlistをnewして、その中にselectAll()で取得したList<GPSData>を代入する所までは記述できたのですが、このあとどうしたらlistの中のデータをsetterとgetterで取り出せますか? GpsDao gdao = new GpsDao(); List<GpsData> list = gdao.selectAll(); 「list.」と書いても、「デフォルト・プロポーザルがありません」となってしまいます。

    • ベストアンサー
    • Java
  • 【vb6】イメージリストに対する検索(?)につい

    お世話になります。 VB6のイメージリストに関して質問があるのですが、 ツリービューのノードに対応する100枚ほどのアイコンファイルを メソッドを使ってイメージリストに放り込んでいるのでいるのですが、 設定ファイル(txt)を元に対応させていて ノードと1対1なのではなく、何枚かは使いまわせるようになっています。 が、 アイコンを読み込んだ順にインデックスをキーの代わりに 1,2,3、・・・としていくのならリストに追加できるのですが、 キーを設定しようとするとダブりができてしまいます。 これから追加しようとしているキーがイメージリストの中にあるかを 調べられればいいのですが、どうやったら良いのか分かりません。 イメージリストのオブジェクトにもよさげな物が無かったため、 教えてもらうしかないと思いました(笑)。 どなたか知っている方がいらっしゃれば教えてください。 よろしくお願いします。 (PS.キーに設定するのは固有な名前で、一つしか無いものです。)

  • VBのツリービューについて

    こんにちは。 ツリービューのインデックスを移動させるメソッドはあるのでしょうか? nodes.indexに値を代入してもエラーが出てしまいます。 ヘルプをみてもわかりませんでした。 どなたかご教授お願いします。

  • エクセルマクロのリスト項目への値の代入について

    「Worksheet_Change」において、下記(一部抜粋プログラム) のように、あるエラーメッセージを出力後、 『リストから選択する項目』にリストに存在する値 を代入すると、エラーメッセージの「OKボタン」押下しても、 そのメッセージが無限LOOPのように出力されます。 なお、リストにNULLは存在します。また、実行時、 下記の「エラーチェック」というメッセージは出力 されないため、値の代入のところで止まっているようです。 *** 一部抜粋 ************ MsgBox "その値は設定できません。" Cells(rng.Row, rng.Column) = ある値 MsgBox "エラーチェック"

  • JavaのListについて

    ご覧いただきありがとうございます。 Javaを学び始めた初学者です。 現在クラスライブラリのListで躓いております。 下記のようにListの型指定でクラスを扱い、iとbの値を持つようにします。 Class クラス名  int i; boolean b; static void main(String[] args){ List<クラス名> list = new ArrayList<>(); } このListのiとbの値にユーザーの打ち込んだ情報をsetしたいのですがうまくいきません。 初学者で説明が下手で申し訳ありませんがよろしくお願いします。 質問にあたり不明点、相違点などありましたら、ご指摘いただけると幸いです。 ※OKWAVEより補足:「Webシステム開発」についての質問です。

    • ベストアンサー
    • Java
  • MFCでのリストコントロール

    現在VisualStudio.NET2005を使ってダイアログベースでプログラムを組んでいます。 その中でリストコントロールを配置しており、表形式で表示しています。 普通だったら実行してリスト上にあるデータをクリックすると背景が青になり、選択された状態になりますよね? それをクリックしても選択されないようにしたいのです。 プロパティで簡単にできるかと思ったらそうでもなさそうで・・・。 SetExtendedStyleでも使うのかな?と思って、 調べたのですが、ちょっとわからなかったので、 教えて頂きたいのです。 よろしくお願いします。

  • Javaコレクションフレームワークの、クラス型とインタフェース型の使い分けについて

    Javaコレクションフレームワークの、クラス型とインタフェース型の使い分けについてですが、 newで作ったインスタンスを、 クラス型に代入する場合と、インタフェース型に代入する場合があるのですが、どちらを優先して使ったほうがいいですか? ※物によっては、インタフェース型しかつかえないとか、どちらでも良い場合とかいろいろあると思います。 また、インタフェース型のほうがメソッドの種類が若干多いですが、抽象メソッドなのでオーバーライドして使うからそれは関係ないのかな。 ・本に出てきた例 ArrayList<E> list = new ArrayList<E>(); List<E> list = new ArrayList<E>(); Queue<E> queue = new LinkedList<E>(); LinkedList<E> list = new LinkedList<E>(); LinkedList<E> stack = new LinkedList<E>(); Set<E> set = new HashSet<E>(); Map<E, M> map = new HashMap<E, M>();

    • ベストアンサー
    • Java