• 締切済み

2次元配列でウォッチが出来ない

2次元配列でウォッチが出来ない 環境 windowsXP Prp Visual Stadio2003 下記の状況で2次元配列のウォッチが出来ません。 1.Visual Stadio2003を起動 2.ファイル→新規作成→プロジェクト 3.プロジェクトの種類はVisual C++プロジェクトでテンプレートからWindowsフォームアプリケーションを選択して、 プロジェクト名に「test」と入力後OKボタン押下 4.Formの適当な位置にボタンを貼り付ける 5.貼り付けたボタンをダブルクリックしてボタンクリックイベントの中(Form1.h)に以下の処理を記述する char cWork[5][20]; memcpy(&cWork[0],"こんにちは",sizeof(cWork)); 7.memcpy(&cWork[0],"こんにちは",sizeof(cWork)); にブレイクポイントを置いて、デバッグ実行をする 8.フォームのボタンを押下してブレイクポイントで止まったら「cWork」をウォッチする 9.memcpy(&cWork[0],"こんにちは",sizeof(cWork)); をステップ実行後ウォッチで内容を確認すると以下のようになります ━cWork{Length=5}char[][][] ┣━ ┣━ ┣━ ┣━ ┗━ ウォッチは出来ませんが、cWorkの中身をテキストボックスに表示や1次元配列に格納したところ cWorkに正しく値は入っていました。 ウォッチ出来ないのはVisualStadio2003のバグなのでしょうか? お分かりになられる方いらっしゃいましたらご教授お願いいたします。

みんなの回答

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.4

>cWork[0][0] ええと、其の様なメモリ空間を普通見るならcWorkだけで5つの20バイト空間らしきものが+付きで表示されると思うのですが、それこそ、その前にメモリ破壊とかのコードがあ有れば、VC++自体がメモリの把握は出来なくなります。 全体のコードが不明なので、推測ですが。

yamadachan
質問者

補足

ご回答ありがとうございます。 プロジェクト作成時に、 Windowsフォームアプリケーションを選択している為、 現象が発生しているのかと思っています。 ボタンのイベントにchar cWork[5][20]; のみ書いてcWorkをウォッチするとt_nojiriさんのおっしゃる通り、 5つの20バイト空間らしきものが+付きで表示されるはずなのですが、 下記のような状態になっています。 - cWork {Length=5} char[][][] ┣━ ┣━ ┣━ ┣━ ┗━

  • hanmemomo
  • ベストアンサー率35% (205/580)
回答No.3

t_nojiri さんw撃沈ありがとです この方が書いた、 >&cWork[0]で配列のアドレスのアドレス指してしまってます。 の意味がわかれば解決する気がしますね ウォッチなどは実体化していない変数などには効果がないことがあります。 C言語などは書いたとおりに実行していないことがあり、 例として10行目で止めても実際には100行あたりで実行していることもあります。 運が悪いときは、実行すらしないこともあります。 Cコンパイラーが自動的に判断して、実行した結果を最初から格納していることがあります。

yamadachan
質問者

補足

再度回答ありがとうございます。 いろいろやってみましたがやはりウォッチ出来ません。 ウォッチでcWork[0][0]を見ようとすると エラー : インデックス '0' は、ポインタ/配列 'work' の範囲外にあります となります。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2

爆撃してますね。普通、strcpy(cWork[0],"こんにちは");で十分なのに &cWork[0]で配列のアドレスのアドレス指してしまってます。 memcpyの指摘は、No1さんと同じですけどアドレスも違うと思ったり。

yamadachan
質問者

補足

回答ありがとうございます。 memcpy(&cWork[0],"こんにちは",sizeof(cWork)); ではなく strcpy( work[0], "こんにちは"); でしたね。 ウォッチとが見れないのと関係あるのでしょうか?

  • hanmemomo
  • ベストアンサー率35% (205/580)
回答No.1

この現象そのものは、調べていませんが、 すでにものすごいバグを書いていますよ。 memcpy(&cWork[0],"こんにちは",sizeof(cWork)); これですけど・・・、sizeof(cWork)の帰り値が絶対に文字より長くないですか? 結果存在していないメモリを参照して、メモリ破壊しますね。 memcpyはテキスト用ではないので"\0"では停止せず、どんどん破壊を 繰り返しますよ・・・ それと、FORMってのがわかりませんが、WINDOWSの文字コードって そのままANSIじゃなくなかったでした?WCHARだった気がします。 これだとさらにメモリ壊すので、ちょい調べてもらえますか?

yamadachan
質問者

補足

回答ありがとうございます。 memcpy(&cWork[0],"こんにちは",sizeof(cWork)); ではなく strcpy( work[0], "こんにちは"); でしたね。 ウォッチとが見れないのと関係あるのでしょうか?

関連するQ&A