こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Listジェネリッククラスのやり方がわからない。

リストジェネリッククラスを使って、テキストファイルから取得したたくさんのデータ(数がわからない)を整理しながらWireless_ID_str02というデータの中に整理しながら入れていきたいんです。

下のプログラムでビルドはできるのですが、デバッグで見ていくと、i=20000ぐらいまで行くのですが、すべてのデータが全く同じデータで、決まって、テキストファイル内の一番最後の行のデータになってしまってました。

どうして、全く同じデータが収納されてしまうのか教えて頂けないでしょうか?

どうぞ、よろしくお願いします。


List<Wireless_unit_sig^>^ Wireless_ID_str02 = gcnew List<Wireless_unit_sig^>();

Wireless_unit_sig^ Wireless_unit_sig_temp = gcnew Wireless_unit_sig();
i=0;
while(( data = reader->ReadLine()) != nullptr ) {
// カンマ区切りで分解
array<String^>^ split = data->Split( separator );

#if 1
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];
#endif

Wireless_ID_str02->Add(Wireless_unit_sig_temp);
i++;

}

投稿日時 - 2012-04-30 13:08:17

QNo.7449281

すぐに回答ほしいです

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

>どうして、全く同じデータが収納されてしまうのか教えて頂けないでしょうか?

そのように処理するように、あなたが書いてるから。
同じインスタンス使い回してるんだから、そうなって当然。

>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の使い方がわからないとか以前の話)

投稿日時 - 2012-04-30 14:13:56

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

#5 へ

>ネイティブ配列にマネージ型を含むことはできません。
>コンパイルエラーです。
>C++/CLIを使ったことがあれば、一発で見抜けるデタラメです。

でたらめなのはわかってます。
できるだけ、わかりやすいように無理矢理、配列にしてるんですから。

C++/CLI使ってないのは認めますけどね
マネージ型使うならC#使う方が楽だし。

投稿日時 - 2012-04-30 16:46:37

#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を使ったことがあれば、一発で見抜けるデタラメです。

>「基本を勉強しなおしてこい」

まあ、あなたも同じ穴の狢でしょうなあ。
うっひゃっひゃ。

投稿日時 - 2012-04-30 16:25:35

ANo.4

#3で完璧に補足されちゃってますが、「作ったオブジェクトを使い回す」のが問題なのだから使い回さないためには「その都度オブジェクトを作る」だけ。
#2でも言われてますが基本レベルのことなのでコードはいちいち書きません。書いてもらわなきゃわからないというなら「基本からやり直してこい」というだけのことです。

投稿日時 - 2012-04-30 15:07:29

ANo.3

「使い回さないようにすればいいと思っている」という認識は, いつできましたか?

#1 の回答をよく読んでください. ちゃんと
「『最初に一回だけオブジェクトを作って』使い回している」のが問題だ
と書かれていますよ. この文章から「どうすれば使いまわさないようにできるのか」を読み取ってください.

投稿日時 - 2012-04-30 14:47:51

ANo.1

最初に一回だけオブジェクトを作って使い回しているから、Listの要素はどれも同じオブジェクトを指してます。そんだけ。

投稿日時 - 2012-04-30 14:05:32

お礼

回答いつもありがとうございます。

>最初に一回だけオブジェクトを作って使い回しているから、Listの要素はどれも同じオブジェクトを指してます。


私の認識では使い回さないようにすればいいと思っているのですが、その場合、具体的にどうやってプログラム書けばいいのか教えて頂けませんでしょうか。(人)よろしくおねがいしますー

投稿日時 - 2012-04-30 14:36:04

あなたにオススメの質問