- ベストアンサー
リストジェネリッククラスの使い方がわからない
- Listジェネリッククラスを使用してテキストファイルから取得したデータを整理する方法を教えてください。
- Wireless_ID_str02というリストにデータを追加していく際に、全てのデータが同じになってしまう問題が発生しています。
- デバッグの結果を見ると、iが20000ほどまで増えているが、データが全て同じになっていることが分かります。なぜこのような問題が発生するのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>どうして、全く同じデータが収納されてしまうのか教えて頂けないでしょうか? そのように処理するように、あなたが書いてるから。 同じインスタンス使い回してるんだから、そうなって当然。 >List<Wireless_unit_sig^>^ Wireless_ID_str02 = gcnew List<Wireless_unit_sig^>(); 私はいったい何度「この意味を理解していますか」と書けばいいんだろう。 あなたが書いてるものを配列で書き直すと Wireless_unit_sig^ Wireless_ID_str02[20000]; Wireless_unit_sig^ Wireless_unit_sig_temp = gcnew Wireless_unit_sig(); i = 0; while ((data = reader->ReadLine()) != nullptr) { array<String^>^ split = data->Split(separator); Wireless_unit_sig_temp->day_name = split[0]; Wireless_unit_sig_temp->month = split[1]; Wireless_unit_sig_temp->day = split[2]; Wireless_unit_sig_temp->time = split[3]; Wireless_unit_sig_temp->year = split[4]; Wireless_unit_sig_temp->cmd1 = split[5]; Wireless_unit_sig_temp->cmd2 = split[6]; Wireless_unit_sig_temp->ID = split[7]; Wireless_unit_sig_temp->sig1 = split[8]; Wireless_unit_sig_temp->sig2 = split[9]; Wireless_unit_sig_temp->batt_mount = split[10]; Wireless_unit_sig_temp->m_rssi = split[11]; Wireless_unit_sig_temp->s_rssi = split[12]; Wireless_unit_sig_temp->version = split[13]; Wireless_ID_str02[i] = Wireless_unit_sig_temp; i++; } になるんですが、これで何がおかしいのかわからないのであれば 「基本を勉強しなおしてこい」レベル(Listの使い方がわからないとか以前の話)
その他の回答 (5)
- wormhole
- ベストアンサー率28% (1626/5665)
#5 へ >ネイティブ配列にマネージ型を含むことはできません。 >コンパイルエラーです。 >C++/CLIを使ったことがあれば、一発で見抜けるデタラメです。 でたらめなのはわかってます。 できるだけ、わかりやすいように無理矢理、配列にしてるんですから。 C++/CLI使ってないのは認めますけどね マネージ型使うならC#使う方が楽だし。
#2 >あなたが書いてるものを配列で書き直すと > > >Wireless_unit_sig^ Wireless_ID_str02[20000]; >Wireless_unit_sig^ Wireless_unit_sig_temp = gcnew Wireless_unit_sig(); >i = 0; >while ((data = reader->ReadLine()) != nullptr) { >array<String^>^ split = data->Split(separator); > >Wireless_unit_sig_temp->day_name = split[0]; >Wireless_unit_sig_temp->month = split[1]; >Wireless_unit_sig_temp->day = split[2]; >Wireless_unit_sig_temp->time = split[3]; >Wireless_unit_sig_temp->year = split[4]; >Wireless_unit_sig_temp->cmd1 = split[5]; >Wireless_unit_sig_temp->cmd2 = split[6]; >Wireless_unit_sig_temp->ID = split[7]; >Wireless_unit_sig_temp->sig1 = split[8]; >Wireless_unit_sig_temp->sig2 = split[9]; >Wireless_unit_sig_temp->batt_mount = split[10]; >Wireless_unit_sig_temp->m_rssi = split[11]; >Wireless_unit_sig_temp->s_rssi = split[12]; >Wireless_unit_sig_temp->version = split[13]; > >Wireless_ID_str02[i] = Wireless_unit_sig_temp; >i++; >} > > になるんですが、 なりません。理由は簡単です。 >Wireless_unit_sig^ Wireless_ID_str02[20000]; ネイティブ配列にマネージ型を含むことはできません。 コンパイルエラーです。 C++/CLIを使ったことがあれば、一発で見抜けるデタラメです。 >「基本を勉強しなおしてこい」 まあ、あなたも同じ穴の狢でしょうなあ。 うっひゃっひゃ。
- D-Matsu
- ベストアンサー率45% (1080/2394)
#3で完璧に補足されちゃってますが、「作ったオブジェクトを使い回す」のが問題なのだから使い回さないためには「その都度オブジェクトを作る」だけ。 #2でも言われてますが基本レベルのことなのでコードはいちいち書きません。書いてもらわなきゃわからないというなら「基本からやり直してこい」というだけのことです。
- Tacosan
- ベストアンサー率23% (3656/15482)
「使い回さないようにすればいいと思っている」という認識は, いつできましたか? #1 の回答をよく読んでください. ちゃんと 「『最初に一回だけオブジェクトを作って』使い回している」のが問題だ と書かれていますよ. この文章から「どうすれば使いまわさないようにできるのか」を読み取ってください.
- D-Matsu
- ベストアンサー率45% (1080/2394)
最初に一回だけオブジェクトを作って使い回しているから、Listの要素はどれも同じオブジェクトを指してます。そんだけ。
お礼
回答いつもありがとうございます。 >最初に一回だけオブジェクトを作って使い回しているから、Listの要素はどれも同じオブジェクトを指してます。 私の認識では使い回さないようにすればいいと思っているのですが、その場合、具体的にどうやってプログラム書けばいいのか教えて頂けませんでしょうか。(人)よろしくおねがいしますー