• ベストアンサー

VC++「オブジェクト参照がオブジェクト・・・・

Stringで2次元配列をやりたいと思っているのですが、 array<array<String^>^>^ addr_eeprom02; このような宣言をしたのですが、 次のようなプログラムを実行使用とすると addr_eeprom02[cnt_test][1] = data->Substring( 1, 8 ); ビルドは通ったのですが、デバッグしていくと 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」 というエラーが出ます。 解決方法などありませんでしょうか?

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

その記法で書く場合、addr_eeprom[]の各要素はgcnewで確保する必要があります。 C++/CLI的な二次元配列は array<String^, 2> で宣言して addr_eeprom[cnt_test,1] でアクセスするのが一般的です。

参考URL:
http://vene.wankuma.com/ecma372/24_cli_array.aspx
diy_sunny
質問者

お礼

回答いただきありがとうございました。参考サイトも紹介していただき助かりました。 array<String^,2>^ addr_eeprom02 = { {"test","test2","test3"},{"test","test2","test3"} }; という宣言でメッセージ出てこなくなりました!

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

まず、「ビルドが通った」は文法が間違ってないだけでプログラムの間違いまでは検出しません。 で、C++/CLIのarrayはCの配列と違って領域確保済みではありません。 > array<array<String^>^>^ addr_eeprom02; は、Cっぽく表現を変えると String** addr_eeprom02; ということです。 #これでコンパイルが出来る訳ではもちろんありません。便宜上の表記です 要はaddr_eeprom02に配列のオブジェクトを作っていないのが原因。

diy_sunny
質問者

お礼

回答いただきありがとうございます。 ネット上で”「オブジェクト参照がオブジェクト インスタンスに設定されていません。」 ” これが出る原因をしらべてみたら、配列内がnullでそれにアクセスするから出てくるということが書かれてました。たぶんnullじゃないようにすればいいとおもうのですが、 通常の配列を宣言 array<String^>^ addr_eeprom = {"test","test2","test3"}; このように宣言した際に addr_eeprom[0] = data->Substring( 1, 8 ); addr_eeprom[1] = data->Substring( 1, 8 ); addr_eeprom[2] = data->Substring( 1, 8 ); このプログラムを正常に実行できたのですが、 array<array<String^>^>^ addr_eeprom02 = { {"test","test2","test3"} {"test","test2","test3"}          }; 多元配列の場合はこのような宣言の仕方をすればよいのでしょうか?これだとエラーがでてしまったのですが・・・

関連するQ&A

  • Arrayオブジェクトを使った多次元配列の作り方

    こんにちは。 JavaScriptで多次元配列を宣言したいのですが、 配列を宣言するのに使うArrayオブジェクトでの宣言方法がわかりません。 多次元配列を宣言することって、そもそも可能なのでしょうか? どうぞよろしくお願いします

  • VC++の構造体について。

    テキストファイルからのテキスト文を1行づつString^ dataに入れておいてストックしておくようなグローバル変数を作るために次のような構造体を作成しましたがエラーが出てしまいます。 このような構造体を作成して eeprom_data eeprom_data;と宣言して eeprom_data->line_test[0].data; などのようにデータにアクセスするようにしたいのですが、どのようにしたらできますでしょうか? typedef struct _line_test_ { String^ data; String^ adress; int length; }line_test; typedef struct _eeprom_data_ { array<line_test^>^ line_test = gcnew array<line_test^>(32); }eeprom_data; 現在のエラー内容はこのように表示されています。 1> HomeBank.cpp 1>c:\.....\10-03\homebank\homebank\Form1.h(763): error C2814: 'HomeBank::Form1::_line_test_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(764): error C3265: マネージ 'data' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(765): error C3265: マネージ 'adress' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(772): error C2814: 'HomeBank::Form1::_eeprom_data_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3265: マネージ 'line_test' をアンマネージ 'HomeBank::Form1::_eeprom_data_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C2864: 'HomeBank::Form1::_eeprom_data_::line_test' : static const int データ メンバー以外をクラス内で初期化することはできません ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== どうぞご教授頂きますよう、よろしくお願いします。

  • オブジェクトを配列として扱いたい

    Java(オブジェクト指向)を始めて数日の者です。 LinkedListを利用し、インスタンス化したオブジェクトをListに入れて 扱えるようにしたいと考えています。 具体的には LinkedList<クラス名> array = new LinkedList<クラス名>(); クラス名 object1 = new クラス名(); -object1の処理- array.add(object1); -object1の処理- array.add(object1); -object1の処理- array.add(object1); このようにして、object1を配列で管理するイメージです。 object1の処理結果は、毎度変わっています。 しかしこれですと、最後のobject1の処理の内容がすべてのarray(i)に入ってしまいます。 要は、array(i)は全て、同じobject1を参照しているだけ。 object1の変更結果がarray(i)に入っていくというイメージでは無い、ということでしょうか? また、この他でインスタンス化したものを配列で管理できるような方法がございましたら、ご教授いただけると幸いです。m(_ _)m 動的に配列の要素数を変更(要素が追加)ができるようにしたいのです。

    • ベストアンサー
    • Java
  • php オブジェクトデータ内の配列にアクセスしたい

    失礼します。 phpでのオブジェクトデータ内の配列にアクセスしたいのですが、うまくいきません。 下記(phpunit)のtitle配列内データにアクセスする際にどういった表記をすれば良いのでしょうか? ご教授宜しくお願い致します。 object(PHPUnit_Extensions_Database_DataSet_DefaultTable)#334 (2) { ["tableMetaData":protected] => object(PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData)#331 (2) { ["columns":protected] => array(2) { [0]=> string(2) "id" [1]=> string(5) "title" } ["primaryKeys":protected] => array(0) { } ["tableName":protected] => string(14) "hogehoge" } ["data":protected] => array(1) { [0]=> array(3) { ["id"]=> string(2) "1" ["title"]=> string(13) "test_titleです。" } } ["other":"PHPUnit_Extensions_Database_DataSet_AbstractTable":private] => NULL }

    • ベストアンサー
    • PHP
  • オブジェクト参照がオブジェクト インスタンスに設定されていません  というエラーについて

    タイトルの「オブジェクト参照がオブジェクト インスタンスに設定されていません」についてですが、 このエラーは、 null を参照しようとして例外が発生している エラーだと解釈しているのですが、nullでないのに、このエラーが出る場合はどのように対処すればいいのか教えてください。 下記のような文があるとします。 Dim aaa as String 'aaaは、データベースからデータをとってきています。 If aaa IsNot DBNull.Value Then DropDownList.SelectedItem.Text = aaa.TrimEnd 'ここでエラー End If aaaは、NullではないのでIf文の中に入っていくのですが、DropDownListにデータを入れようとすると、タイトルのようなエラーが発生します。 デバッグでaaaの値を見ても、ちゃんとデータが入っているし、Nullではないのですが、なぜこのようなエラーが出るのかわかりません。 このエラーは他に違う意味があるのでしょうか? また、他に影響している部分があるのでしょうか? どなたか教えてください。 よろしくお願いいたします。

  • 配列の初期化

    表題の件で質問があります。 //------------------------------------// $A_array = array("1", "2", "3"); $B_array = array("9", "8"); for($cnt=0;$cnt<count($A_array);$cnt++){ $test[] = $A_array[$cnt]; } for($cnt=0;$cnt<count($B_array);$cnt++){ $test[] = $B_array[$cnt]; } ※わかりやすいようの簡単に書いてみました。 //------------------------------------// 上記の処理の場合配列testには ("9", "8", "3")となってしまい、 ("9","8")のデータを取得できません。 簡単に言うと配列名を使いまわししたいと考えています。関数かなにかで配列の中身を初期化するような ものはありますでしょうか?

    • 締切済み
    • PHP
  • 連想配列、オブジェクト配列の使い分け

    お世話になります。 データベースで結果を取得する場合など、連想配列のままではなく何故、わざわざオブジェクトに格納する様な手法が使われるのでしょうか? 連想配列のままで処理するほうが早いと思いますし、それに付随するクラスファイルも多くなります。また、「結びつきを緩くして仕様変更に耐えうる様に」など聞きますが、余計複雑になってしまう様な気がしますので、メリットが今ひとつ分からず判断に迷ってしまいます。 どの様な使い分け、考え方をすれば良いかアドバイスいただけたら幸いです。 何卒、宜しくお願いします。 例) ※必要と思われる部分のみ記述しております。 ■連想配列 while($row=mysql_fetch_assoc($res)){ ~以下必要な処理} ■オブジェクト配列 while($row=mysql_fetch_assoc($res)){ $example = new Example(); $example->setName($row['name']); $example->setAddr($row['addr']); $array[] = $example } ~以下必要な処理 ○モデル class Example { private $_name = null; private $_addr = null; public function __construct() {} public function setName($name) { $this->_name = (string) $name; return $this; } public function getName() { return $this->_name; } public function setAddr($addr) { $this->_addr = (string) $addr; } ~以下省略 }

    • ベストアンサー
    • PHP
  • これは試験にでるといわれたのでどなたおしえてもらえませんか

    このソースファイル(Ex2DTest.java)は2次元の参照型配列を用いるプログラムである。3×3の2次元の参照型配列を用いることができるように完成しなさい class SamData{ int x,y,z; void print(){ System.out.println(x+y+z); } } class Ex2DTest{ public static void main (String[] args){ //配列の宣言とインスタンス化   for(int i=0; i<array2d.length;i++){ for(int i=0;i<array2d[i].length;i++){ array2d[i][j].x=i*j; array2d[i][j].y=i+j; array2d[i][j].z=i-j; array2d[i][j].print(); } } } } 分かる方いらっしゃれば是非教えてください! よろしくおねがいします。

    • ベストアンサー
    • Java
  • オブジェクトの参照渡しについて

    メソッドの引数にオブジェクトを指定した場合、 それは「参照渡し」だと理解していました。 でも以下のプログラムでは、指定したオブジェクトに変化がありません。 public static void main(String[] args) { BigDecimal b = new BigDecimal(1); System.out.println(b); test(b); System.out.println(b); } public static void test(BigDecimal b) { b = new BigDecimal(2); } 出力は以下です。 ------------------------- 1 1 ------------------------- どういうことでしょうか? 正しい知識をお教えください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • グローバル変数について

    言語:Visual c++ 2008 Express Edition OS:win xp pro Win用イベント処理から呼ばれるプログラムをコンパイルすると以下のメッセージが表示される。 グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバを宣言することはできません。 プログラムの中で、1次元の配列として以下のように array<System::String ^> ^output = gcnew array<String^>(MAX_PAT_LEN); // OUTPUT Table とグローバル変数を定義している。 関数aの中で position[cnt][0] = i - output[ state]->Length +1 ; /* 位置 */ position[cnt][1] = output[ state]->Length ; /* パターン長さ*/ とか参照して、 関数bの中で output[ state] = gcnew String( reinterpret_cast<char*>(pat) ) ;/* パターンの設定*/ とか設定しているだけなんです。 最上位の関数で確保して,パラメタで渡してもいいんですが、最上位と目的の関数にある途中の関数にパラメタを追加しなければならないので、大変です。 どうすればいいか,分かる方がおりましたら教えて下さい。 よろしくお願いします

専門家に質問してみよう