配列で宣言したクラスのデバッグ中にエラーが発生する

このQ&Aのポイント
  • 32個分のWireless_ID_strにすべて「test」と代入しようとすると、'System.NullReferenceException' のハンドルされていない例外が発生します。
  • このエラーは、オブジェクト参照がオブジェクトインスタンスに設定されていないためです。
  • 解決するには、Wireless_unit_strクラスのコンストラクタでWireless_ID_strを初期化する必要があります。
回答を見る
  • ベストアンサー

クラスを配列で宣言してデバッグ中にエラーが出る。

今、"Wireless_unit_str"というクラスをWireless_ID_str02 で宣言してこれを32個分宣言して Wireless_ID_str02[i]->Wireless_ID_str = "test"; 32個分のWireless_ID_str の中に全部”test” と代入してみようとしたのですが、デバッグ最中にその文を実行しようとすると、つぎのようなエラーが出ます。 (エラー内容) ”'System.NullReferenceException' のハンドルされていない例外が HomeBank.exe で発生しました。 追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。” 解決する方法はないでしょうか? array<Wireless_unit_str^>^ Wireless_ID_str02 = gcnew array<Wireless_unit_str^>(32); for(i=0; i < 32;i++) { Wireless_ID_str02[i]->Wireless_ID_str = "test"; } 作成したクラス”Wireless_unit_str”の内容 namespace HomeBank { using namespace System; using namespace System::Collections::Generic; /** * 明細データクラス */ ref class Wireless_unit_str { private: DateTime date; // 日付 String^ name; // 品名 String^ kind; // 分類 int money; // 金額 public: String^ Wireless_ID_str; //array<String^>^ Wireless_ID_str = gcnew array<String^>(32); public: Wireless_unit_str() { Wireless_ID_str = "test"; } }; }

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

  • ベストアンサー
回答No.1

for(i=0; i < 32;i++) { Wireless_ID_str02[i] = gcnew Wireless_unit_str(); // 追加 Wireless_ID_str02[i]->Wireless_ID_str = "test"; }

diy_sunny
質問者

お礼

回答頂きありがとうございます!!  gcnewってこういう風に使うんですね。

関連するQ&A

  • unsighed charの数値をstringに

    for(k=0;k < 6;k++) { Wireless_ID_str02[i]->Wireless_ID_str += Wireless_unit[i].wireless_id[k].ToString("X2"); } このようなブログラムを使ってWireless_unit[i].wireless_id[k] unsighed charの次の数値 Wireless_unit[i].wireless_id[0] = 1; Wireless_unit[i].wireless_id[1] = 1; Wireless_unit[i].wireless_id[2] = 1; Wireless_unit[i].wireless_id[3] = 1; Wireless_unit[i].wireless_id[4] = 1; Wireless_unit[i].wireless_id[5] = 1; これを stringの Wireless_ID_str02[i]->Wireless_ID_str この中に”111111” というように代入していきたいのですが、 実際に入ってきたのは Wireless_ID_str02[i]->Wireless_ID_str = ”test313131313131” となりました。 Wireless_ID_str02[i]->Wireless_ID_str = ”111111” という風に代入する方法はありませんでしょうか。 ”Wireless_unit”というのは Wireless_unit Wireless_unit; というので宣言しています。 struct Wireless_unit { unsigned char wireless_id[6]; unsigned char use; unsigned char tampa_sig_m1; unsigned char tampa_sig_m2; unsigned char tampa_sig_m34_set; unsigned char tampa_sig_m34_reset; unsigned char battlow_sig_m1; unsigned char battlow_sig_m2; unsigned char battlow_sig_m34_set; unsigned char battlow_sig_m34_reset; unsigned char sch_sig_m1; unsigned char sch_sig_m2; unsigned char sch_sig_m34_set; unsigned char sch_sig_m34_reset; unsigned char ch1_use; unsigned char ch1_emg_sig_m1; unsigned char ch1_emg_sig_m2; unsigned char ch1_emg_sig_m34_set; unsigned char ch1_emg_sig_m34_reset; unsigned char ch2_use; unsigned char ch2_emg_sig_m1; unsigned char ch2_emg_sig_m2; unsigned char ch2_emg_sig_m34_set; unsigned char ch2_emg_sig_m34_reset; }; また、 ”Wireless_ID_str02”は array<Wireless_unit_str^>^ Wireless_ID_str02 = gcnew array<Wireless_unit_str^>(32); このように宣言しています。 namespace HomeBank { using namespace System; using namespace System::Collections::Generic; /** * 明細データクラス */ ref class Wireless_unit_str { private: public: String^ Wireless_ID_str; //array<String^>^ Wireless_ID_str = gcnew array<String^>(32); public: Wireless_unit_str() { Wireless_ID_str = "test"; } }; }

  • List<T> クラスでデータを入れても同じになる

    Wireless_unit_sigクラスというのにデータを入れていきたいのですが、読み込んだファイルの中にデータが20000データぐらいあるため、Listジェネリッククラスというので宣言してみました。 List<Wireless_unit_sig^>^ Wireless_ID_str02 = gcnew List<Wireless_unit_sig^>(); この時に、 Wireless_ID_str02[i]->day_name = split[0]; Wireless_ID_str02[i]->month = split[1]; Wireless_ID_str02[i]->day = split[2]; Wireless_ID_str02[i]->time = split[3]; Wireless_ID_str02[i]->year = split[4]; Wireless_ID_str02[i]->cmd1 = split[5]; Wireless_ID_str02[i]->cmd2 = split[6]; Wireless_ID_str02[i]->ID = split[7]; Wireless_ID_str02[i]->sig1 = split[8]; Wireless_ID_str02[i]->sig2 = split[9]; Wireless_ID_str02[i]->batt_mount = split[10]; Wireless_ID_str02[i]->m_rssi = split[11]; Wireless_ID_str02[i]->s_rssi = split[12]; Wireless_ID_str02[i]->version = split[13]; このようにデータを入れていこうとしたのですが、エラーが出るのですが、データを収納していく方法というのはどのようにしていけばよいのでしょうか? 作成したクラスは次のようなものです。 どうぞ、教えて頂きますよう、お願い致します。 ref class Wireless_unit_sig { private: public: String^ day_name; String^ month; String^ day; String^ time; String^ year; String^ cmd1; String^ cmd2; String^ ID; String^ sig1; String^ sig2; String^ batt_mount; String^ m_rssi; String^ s_rssi; String^ version; String^ s_rssi_fixed; public: Wireless_unit_sig() { day_name = "test"; month = "test"; day = "test"; time = "test"; year = "test"; cmd1 = "test"; cmd2 = "test"; ID = "test"; sig1 = "test"; sig2 = "test"; batt_mount = "test"; m_rssi = "test"; s_rssi = "test"; version = "test"; s_rssi_fixed = "test"; } }; }

  • StreamReaderで読み込んだテキストの行数

    テキストファイルを読み込んで行数文のクラスの配列を宣言したいと思っているのですが、 Wireless_unit Wireless_unit[32]; array<Wireless_unit_str^>^ Wireless_ID_str02 = gcnew array<Wireless_unit_str^>(32); 行数がわからないので、StreamReader^で宣言したreadで知る方法はありませんでしょうか? 下のような関数でファイルを読み込んでいます。 private: bool LoadCsvFile02( String^ path ) { StreamReader^ reader = gcnew StreamReader( path, System::Text::Encoding::GetEncoding("shift-jis")); ----(中略)------------------------------------------------

  • stringのデータではswitch文は使えない?

    String^ id_data_str というのに、"313131313131"というデータを入れて、下のGet_idというクラスを作って、”111111”というデータをとれるようにしたいと思ったのですが、 Get_id^ Get_id; Get_id_get(id_data_str); switch文は整数型出ないとダメだというエラーが出てきたのですが、このようなクラスのプログラムはダメなんでしょうか?何か解決方法などいただけませんでしょうか? namespace HomeBank { using namespace System; using namespace System::Collections::Generic; /** * 明細データクラス */ ref class Get_id { private: public: String^ ID_str; String^ ID_str_complete; //array<String^>^ Wireless_ID_str = gcnew array<String^>(32); public: Get_id() { ID_str = "test"; ID_str_complete = "test"; } void Get_id_get(String^ ID_str) { int i; String^ test_str; String^ str_data; Get_id(); ID_str_complete = ID_str; for(i=0;i<6;i++) { test_str = ID_str->Substring( i*2, 2 ); switch(test_str) { case "30": str_data = "0"; break; case "31": str_data = "1"; break; case "32": str_data = "2"; break; case "33": str_data = "3"; break; case "34": str_data = "4"; break; case "35": str_data = "5"; break; case "36": str_data = "6"; break; case "37": str_data = "7"; break; case "38": str_data = "8"; break; case "39": str_data = "9"; break; case "61": str_data = "A"; break; case "62": str_data = "B"; break; case "63": str_data = "C"; break; case "64": str_data = "D"; break; case "65": str_data = "E"; break; case "66": str_data = "F"; break; default; str_data = "_"; break; } if(i==0) ID_str_complete = str_data; else ID_str_complete += str_data; } } }; }

  • 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++; }

  • デバッグ中の変数参照について

    VS2005のC++/CLIでアプリを作っているものです。 デバッグ中に作成したメソッドの引数に渡されて来る値をウォッチで 見ようとすると「エラー: 識別子 'str' はスコープ外です」となり 中身が見れません。 作成したクラスのメンバ変数は見れます。 以下が発生したソースです。 ---------------------------- TestClass.cpp ---------------------------- #include "StdAfx.h" #include "TestClass.h" using namespace System; TestClass::TestClass(void) { } // 追加メソッド void TestClass::func( String^ str ){ String^ tmp; tmp = str; } ---------------------------- TestClass.h ---------------------------- #pragma once using namespace System; ref class TestClass { public: TestClass(void); // 追加メソッド void func( String^ ); }; ---------------------------- Form1.h ---------------------------- #pragma once #include "TestClass.h" namespace test2 { (省略) public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // TestClass^ aaa = gcnew TestClass(); aaa->func( "あいうえお" ); } (省略) ---------------------------- プロジェクトは、CLRのWindowsフォームアプリケーションで作成しています。 初心者の質問ですが、宜しくお願い致します。

  • ActionScriptでクラスの配列

    ActionScript3をちょっと触っているのですが、 Stringや独自クラスの配列の変数を宣言する 事は出来ないのでしょうか? var str[]:String; みたいな。 Array()を介さないとダメなのでしょうか? とすると、Array()の中が必ずStringだけとは 限らない状況に陥りそうな気がするのですが・・・。 実現方法をご教示下さい。

    • ベストアンサー
    • Flash
  • C++/CLIのオブジェクト型配列

    VC++/CLIで、オブジェクト型の配列data、ArrayData(String^ s, int a, int d, double c)でコンストラクタをつくり array<Object^>^ data = gcnew ArrayData(String^ s, int a, double b); でインスタンス化したいのですがうまくいきません。 さらに、他クラスから、d->data[i].aで、data[i]」の配列のうち、整数型変数aを参照したいたいと思っていますがそれも上手くいきません。 例えば data[0]= gcnew ArrayData("山田",30,45.2); data[1]= gcnew ArrayData("高橋",66,43.2); data[2]= gcnew ArrayData("田中",86,62.7); のdata配列を用意します. VC++2005で作成したファイルを載せますので、それに対応したコード(.hファイルと.cppファイル)を教えてくれるとありがたいです。 このままでは、エラーです。内容は、メンバ変数、ドット演算子など。 --File Name:ArrayData.h-- #pragma once using namespace::System; ref class ArrayData { public:array<object^>^ data; public: ArrayData(String^ name,int data1,double data2); }; --File Name:ArrayData.cpp-- #include "StdAfx.h" #include "ArrayData.h" ArrayData::ArrayData() { data= gcnew array<Object^>(5); data[0]= gcnew ArrayData("山田",30,45.2); data[1]= gcnew ArrayData("高橋",66,43.2); data[2]= gcnew ArrayData("田中",86,62.7); } --File Name Form1.h-- #pragma once #include"ArrayData.h" namespace TestDataArray { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // ArrayData^ abc = gcnew ArrayData(); //ArrayDataクラスのインスタンス化 int bee= abc->data[0].data1; //data[0]配列のdata1の値(=30)を参照 String^ cee=bee.ToString();  //beeを文字列化 MessageBox::Show(cee); //メッセージボックスにceeを表示 } protected: /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> ~Form1() { if (components) { delete components; } } private: /// <summary> /// 必要なデザイナ変数です。 /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// デザイナ サポートに必要なメソッドです。このメソッドの内容を /// コード エディタで変更しないでください。 /// </summary> void InitializeComponent(void) { this->components = gcnew System::ComponentModel::Container(); this->Size = System::Drawing::Size(300,300); this->Text = L"Form1"; this->Padding = System::Windows::Forms::Padding(0); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; } #pragma endregion }; } --File Name:TestDataArray.cpp-- // TestDataArray.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" #include "Form1.h" using namespace TestDataArray; [STAThreadAttribute] int main(array<System::String ^> ^args) { // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; }

  • 配列を使ったビットマップクラス

    VC++を使ったフォームアプリケーションでビットマップなどの画像を表示させ、ピクセル処理を施せるプログラムを作りました。このプログラム上ではピクチャボックスを1つ用意していますが、今後もっと多くのピクチャボックスが必要になってきます。以下のプログラムではBitmapクラスのbmpをピクチャボックス1の画像に入れています。単純にBitmapクラスのbmpを増やせば(例:bmp1)、ピクチャボックスが増えても平気ですが、処理の関係上配列を使いたいと思っています。なので下に書いてあるプログラムのbmp->という部分をbmp[0]->というふうに変えたいと考えています。自分なりに調べて(1)、(2)の部分を変えればいいと思うのですがどうもうまくいきません。わかる方がいたらご教授ください、おねがいします。 #pragma once namespace bmp { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Text; using namespace System::Collections::Generic; /// <summary> /// Form1 の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // bmp = nullptr; ……… (1) //Bitmap^ bmp[300]; }      //省略// #pragma endregion //private: array<Bitmap^>^ bmp = gcnew array<Bitmap^>(300); ……… (2) private: Bitmap^ bmp; private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { bmp = gcnew Bitmap("C:/Documents and Settings/Owner/デスクトップ/lena.bmp",true); pictureBox1->Image = bmp; } private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) { /*bmp = gcnew Bitmap("C:/Documents and Settings/Owner/デスクトップ/lena.bmp",true);*/ int x,y; int w = bmp->Width; int h = bmp->Height; for(x = 0; x < w; x++){ for(y = 0; y < h; y++){ if(x < (w * 0.05) || y < (h * 0.05) || (y > (h - (h*0.05)))&&(y < h) || (x > (w - (w*0.05)))&&(x < w)){ Color pixelColor = bmp->GetPixel( x, y ); Color newColor = Color::FromArgb( 255, 0, 0 ); bmp->SetPixel( x, y, newColor ); } } } pictureBox1->Image = bmp; } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { } }; }

  • VC++メッセージの送受信について教えてください。

    VC++でソフトを作成しています。 初心者なのでわからないことだらけです。 どなたかご教授お願いします。 ■環境 Windows xp mode Visual Studio 2010 Professional VC++ フォームアプリケーション .net Framework4.0 ■相談内容 アプリ1のtextBoxに入力された文字列をアプリ2に送信して、アプリ2のtextBoxに表示させたいのですが、PostMessageを使用するとメッセージが送れません。 また、SendMessageを使用すると送れますが、共有メモリを使用すると文字列が途中で途切れてしまいます。 PostMessageと共有メモリの使用は指令なのではずせません。 理由は送信側のアプリがロックされるのを防ぐため、後に多数のアプリから送信した文字列を取得できるようにするためです。 下記にソースコードを記載しますので、どこが悪いのか、何が原因でそうなるのか、どうすれば正常に動作するようにできるのかを教えてください。 特に、ソースについてはどこをどのように直せば良いかを教えていただけるとありがたいです。 ~送信側ソース~ #pragma once #include<windows.h> #include<iostream> #include<fstream> #include<string> #include<msclr/marshal.h> #pragma comment(lib,"user32.lib") int s; using namespace std; using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Runtime::InteropServices; using namespace msclr::interop; [DllImport("user32.dll") ] extern System::String^ FindWindow(String^ lpClassName, String^ lpWindowName); [DllImport("user32.dll")] extern System::String^ PostMessage(HWND hWnd, int Msg, int wParam, int lParam); public: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { System::String^ moji_textBox4; moji_textBox4=textBox4->Text; s=textBox4->Text->Length+1; COPYDATASTRUCT cd; HWND hWnd; char buffer[500]; sprintf_s(&buffer[0],5,"%s",moji_textBox4); cd.dwData=0; cd.cbData=s;//strlen(buffer)+1; cd.lpData=buffer; hWnd=::FindWindow(nullptr,L"アプリ2"); ::PostMessage((HWND)hWnd,WM_COPYDATA,0,(LPARAM)&cd); ~受信側ソース~ #pragma once #pragma comment(lib,"user32.lib") #include<ctype.h> #include<windows.h> #include<msclr/marshal.h> using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Runtime::InteropServices; using namespace msclr::interop; public: virtual void WndProc(System::Windows::Forms::Message% msg) override { if(msg.Msg== WM_COPYDATA) { COPYDATASTRUCT *cd; cd=(COPYDATASTRUCT *)msg.LParam.ToInt32(); System::String^ str; str=gcnew System::String((char *)cd->lpData); pin_ptr<const wchar_t>pstr=PtrToStringChars(str); System::String^ ShareMemoryName1=L"Information"; HANDLE hmap; char *pmap; marshal_context^ context= gcnew marshal_context; LPCTSTR ShareMemoryName2 = context->marshal_as<LPCTSTR>(ShareMemoryName1); hmap=::CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,2048, (LPCTSTR)ShareMemoryName2); pmap=(char *)::MapViewOfFile(hmap,FILE_MAP_ALL_ACCESS,0,0,1024); System::String^ pstr1= gcnew System::String(pstr); ZeroMemory(pmap,2048); memcpy_s(pmap,2048,pstr,sizeof(pstr)); System::String^ str1; str1= gcnew System::String((char *)pmap); textBox6->Text=str1; UnmapViewOfFile(pmap); CloseHandle(hmap); } Form::WndProc(msg); }

専門家に質問してみよう