電子書籍の厳選無料作品が豊富!

リストジェネリッククラスを使って、テキストファイルから取得したたくさんのデータ(数がわからない)を整理しながら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++;

}

A 回答 (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の使い方がわからないとか以前の話)
    • good
    • 0

#5 へ



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

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

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

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

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

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

#3で完璧に補足されちゃってますが、「作ったオブジェクトを使い回す」のが問題なのだから使い回さないためには「その都度オブジェクトを作る」だけ。


#2でも言われてますが基本レベルのことなのでコードはいちいち書きません。書いてもらわなきゃわからないというなら「基本からやり直してこい」というだけのことです。
    • good
    • 0

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



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

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

そんだけ。
    • good
    • 0
この回答へのお礼

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

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


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

お礼日時:2012/04/30 14:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!