• 締切済み

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

  • 2次元配列の動的確保

    ある画像を読み込むため、その画像を格納できる幅、高さを持った配列を動的に確保しようと考えています。 幅をxsize、高さをysizeで次のように記述しました。 unsigned char **src; int i; src = (unsigned char**)malloc(sizeof(unsigned char*) * ysize); src[0] = (unsigned char*)malloc(sizeof(unsigned char) * xsize * ysize); for(i=1; i<ysize; i++) src[i] = (src[0] + i * xsize); わざわざポインタのポインタを使用したのは、動的に確保した配列を2次元的なアクセスをしたかったためです。 画像の読み込み時は fread(src[0], sizeof(unsigned char), xsize * ysize, fp); としています。 上に記述したソースは問題なく動作しました。 しかし、上の場合だと全ての配列を連続して確保することができません。つまりsrcでmallocを一回、src[0]でmallocを一回使っているため、ポインタの配列の直後に配列を確保する保障がありません。そこでいっぺんに確保することを考えました。 unsigned char **src; int i; src = (unsigned char **)malloc(sizeof(unsigned char *) * ysize + sizeof(unsigned char) * xsize * ysize); for(i=0; i<ysize; i++) src[i] = (unsigned char *)(src + sizeof(unsigned char *) * ysize + i * xsize); このように組み上げ、読み込み時は上のfreadと同様に記述したところエラーが出てしまいました。 やはり一行目のmallocで無理やりsizeof(unsigned char *) * ysize + sizeof(unsigned char) * xsize * ysize分確保するのは失敗だったのでしょうか?

  • C言語の配列のコピーについて

    C言語の配列のコピーについて int a[] = {1,2,3}; int b[3]; memcpy(b, a, sizeof(a)); は、分かるのですが、 int c[][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }; int d[4][3]; memcpy(d, c, sizeof(c)); の使い方は正しいのでしょうか? 1次元配列の場合は連続するメモリ?なのでmemcpyでOKだと思うのですが 2次元以上の配列の場合は、メモリが連続しているか知らないので 不安に思いました。 実際、C言語でのメモリの取り方など詳しく書かれている本などありますか? よく初心者向け本にメモリは箱という大雑把なイメージで取り挙げられているのですが、突っ込んだ書籍等も探しています。 玄人の方、難しく(^^教えてください。

  • 二次元配列でソートがしたい

    二次元配列でソートがしたい 二次元配列でソートがしたい 開発環境:Visual Web Developer 2008 express 言語:Visual Basic 上記開発環境でWebアプリケーションを開発中です。 TextBoxを縦20行横10列の表形式に配置し、左から2番目の列に入力された数値をキーに、昇順に並べ替えができるような入力フォームを作成していますが、参考になるようなサイトが見つからなかったので、どなたか参考になるサイトやサンプルロジックを教えて頂けないでしょうか? よろしくお願いします。

  • 多次元配列を動的に取る方法で悩んでいます。

    現在、以下のコードで三次元配列を動的に取る方法を作成しています。 { int i,j; char ***Regdata; LPVOID heapAdr; Regdata = (char ***)HeapAlloc(GetProcessHeap(),HEAP_NO_SERIALIZE,sizeof(char) * 1000); for(i=0;i<=1000;i++){ heapAdr = HeapAlloc(GetProcessHeap(), //ここでエラーが発生します。 HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, sizeof(char) * 6); if(heapAdr != NULL) { Regdata[i] = (char **)heapAdr; for(j=0;j<=6;j++){ heapAdr = HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, sizeof(char) * STRING_LENGTH); if(heapAdr != NULL) { Regdata[i][j] = (char *)heapAdr; } else { break; } } } else { break; } } } この方法だと、約40~50回ループした時点でHeapAlloc関数のところで 実行時エラーが発生してしまいます。 GetLastError関数を用いてエラーメッセージを取得したところ、 「No 998:メモリの場所に無効なアクセスがありました。」 というメッセージが返ってきました。 現状、どうしたらよいのかわからない状態です。 ご存知の方がいらっしゃれば、お教えいただきたいです。 以上、宜しくお願いします。

  • 二次元配列による文字列の配列の受渡しについての質問です。

    二次元配列による文字列の配列の受渡しについての質問です。 #include <stdio.h> void print_pname(char str[][5], int n) { int i, j; for (i = 0; i < n; i++) { printf("str[%d] = \"", i); for (j = 0; str[i][j] != '\0'; j++) putchar(str[i][j]); printf("\"\n"); } } int main(void) { char ary[][5] = {"Lisp", "C", "Ada"}; print_pname(ary, sizeof(ary) / sizeof(ary[0])); return 0; } 上のプログラム中の関数print_pnameの引数char str[][5]についてですが char (*str)[5](配列のポインタ)と変更した場合にwarningが多数発生します。 これはどうしてでしょうか? また、上のプログラムを配列のポインタを使って変更することは可能でしょうか? 以上、よろしくお願いします。

  • 二次元配列について

    二次元配列が確保(?)されてなくて困っています。 プログラム内で、以下のように宣言するのですが、 #define MM 1025 //プログラム6行目 #define NN 10 //7行目 double y[MM][NN]; //17行目 y[0][0] = 3.0; //28行目 Visual Studio.NET のデバッグツールの「ウォッチ」で、 y[0][0]に代入された値を確認しようとすると、 エラー:インデックス'0'は、ポインタ/配列'y'の範囲外にあります と、表示され、中身を確認することができません。 それどころか、プログラムの後半98行目を境に、 y[0][0]の値が上書きされてしまいます。 x[k] = x[0] + k*h; //98行目 ここから、察するにメモリがちゃんと確保されていないと、 思うのですが、どうすればいいかわからず、困っています。 どなたかご教授をお願いいたします。 環境 OS : Windows XP 開発環境 : Visual Studio.NET

  • C言語の配列のサイズ

    二次元配列、三次元配列のサイズが知りたいです。 unsigned char test1[100]; は sizeof( test1 )で100ですが、 unsigned char test1[100][30]; はどのように書いたら100または、30なのか知りたいです。 unsigned char test1[100][30][5]; これも100,30,5のサイズをそれぞれ得る方法が知りたいです。 因みに以下のような数値なし[]を見たことがあるのですが どういう意味でしょうか? unsigned char test1[][30]; サイズを理解していないのは、ポインタを理解していないと同じことでしょうか?今更ながら自分自身が不安です。

  • 配列の配列をmemcpyやmemcmpしたいです

    【環境】WindowsXP(SP2)、VisualStudio2005++(MFC) タイトルの通りなんですが、配列の配列を比較したりコピーしたいのですが、以下に質問を3つ記載させていただきますので、どなたかご教授お願いいたしますm(__)m 1.宣言と初期化について char **buf; buf = new char*[3200]; for(int i=0; i < 3200; i++) { buf[i] = new char[4]; } これで、buf[1]、buf[2]、buf[3]、buf[4]に、それぞれ3200のchar型の配列が宣言された事になりますでしょうか? ※buf[4][3200] なのか buf[3200][4]なのかよく分からないです。 2.上記の方法で定義した2つの配列(bufとtmp)の比較 for(int i =0; i < 4; i++) { memcmp (buf[i], tmp[i], sizeof(tmp[i])); } これで比較出来ますでしょうか? 3.上記の方法で定義した2つの配列(bufとtmp)のコピー for(int i =0; i < 4; i++) { memcpy_s(buf[i], sizeof(buf[i]), tmp[i], 3200 * sizeof(char)); } これではバッファオーバーランエラーが発生してしまうのですが、どこがおかしいでしょうか? 以上3点、初心者の質問なので意味が分からないような箇所があるとは思いますが、どうかご教授お願いいたしますm(__)m  

  • 2次元配列の数値管理をポインター操作で行いたい

    こんにちは。ちょっとわかりにくい説明かと思います。 行いたいイメージは byte test[2][X]= { {0,0,0,0,0},{1,1,1,1,1} }; というデータ配列Xの数が変動するので Mallocを使用して動的にメモリを確保したい。(ここでは例として5つとってますが) それをポインター変数により管理したいと考えています。 byte *test; byte num= 5; test = (byte *)MALLOC(sizeof(byte)*(2*(num))); というようにメモリを確保した後 ある文字列("01001"というような文字列)をこの配列にコピーしたい。 配列のイメージでは test[0]={{0,1,0,0,1}}; test[1]={{1,0,0,1,1}}; というような形で管理したいと思ってます。 pBuffer="01001"; memcpy(pBuffer, test[0], 5); pBuffer="10011"; memcpy(pBuffer, test[1], 5); このように実装しました。 これであってますでしょうか? さらに、ここからデータを取得したい場合 例えば二次元配列でいう test[0][1]に入っている(この例題では)1を取り出すには どのような記述になるのでしょうか? わかりにくい記述で申し訳ないですが、 ご存知の方、よろしくご教授ください。

  • textboxの二次元配列で質問

    textboxの二次元配列で質問 Visual Web Developer 2008を使いWebアプリケーションの入力フォームを開発中です。言語はVBです。  複数行のtextboxに入力された文字を連結する方法が分かりません。ネットでいろいろ検索して二次元配列をすれば可能なようですが、分かりやすく書いてあるサイトが見つからず、苦戦しています。列数は10列。行数は50行ぐらいあります。 ↓(サンプル)  例えば、下のような入力フォームのtextboxにあ・い・う・え・お・か・き……と入力された文字列で、buttonをクリックしたら「あいうえおかきくけこ…」と文字列の連結した実行結果を出したい場合です。       列   あ|い|う|え|お| | |   か|き|く|け|こ| | | 行 さ|し|す|せ|そ| | |   た|ち|つ|て|と| | |   な|に|ぬ|ね|の| | |    | | | | | | |    | | | | | | |    textboxが多いので、二次元配列と繰り返し処理(文字がなくなるまで繰り返す)を使って、簡単にできないでしょうか? 初心者なので分かりづらい質問で申し訳ありません。 参考になるページやコードがあったら教えて下さい。 よろしくお願いします。

専門家に質問してみよう