dポイントプレゼントキャンペーン実施中!

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のバグなのでしょうか?
お分かりになられる方いらっしゃいましたらご教授お願いいたします。

A 回答 (4件)

>cWork[0][0]



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

全体のコードが不明なので、推測ですが。

この回答への補足

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

補足日時:2010/06/22 14:31
    • good
    • 0

t_nojiri さんw撃沈ありがとです


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

この回答への補足

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

補足日時:2010/06/21 19:12
    • good
    • 0

爆撃してますね。

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

この回答への補足

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

補足日時:2010/06/21 18:33
    • good
    • 0

この現象そのものは、調べていませんが、


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

この回答への補足

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

補足日時:2010/06/21 18:32
    • good
    • 0

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