乱数をpに格納して、それをTextOutで表示したいのです。
文字列の表示はできるのですが、数値をどうやってTextOutで表示するのか分かりません。
VCでWin32アプリケーションを作ろうかと思っています。
下は、case WM_PAINT以下です。この部分と、time.hをインクルードするということ程度しか初期段階から変更していませんので、その部分のみ書きました。
case WM_PAINT:
srand((unsigned)time(NULL));
int p;
p = rand();
char* buff;
buff = 0;
wsprintf( buff,"%d",&p);
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc,10,10,buff,strlen(buff));
EndPaint(hWnd, &ps);
break;
このようなソースを作りました。これを実行すると、「書き込み中にアクセス違反が発生しました」と出てしまいます。wsprintfに問題があるのではないかと思っています。ですが、解決策・原因が分かりません。分かっている方には簡単な質問で面倒かとは思いますが、どうぞよろしくお願いいたします。
未だポインターとメモリアロケートの仕組みを理解していないと見ました。
一度C言語入門のWEBサイトで基本をじっくり覚える事をお奨めします。
数値を変換した文字列を格納できるだけの容量(バイト数)のバッファを用意する必要があります.
現在のコードでは,ポインタ(buff)が指すべきバッファの実体がどこにもありません.
char * は文字列ではありません。
「どこかにある文字列の場所を指し示しているもの」です。
wsprintf に char * を渡すということの意味は「この先にある文字列に書き込んでくれ」と言っているのと同じことです。
で、これ。
> buff = 0;
> wsprintf( buff,"%d",&p);
ポインタにゼロを代入するということは、そのポインタは「どこも指していない」ということを意味します。
そんなものを wsprintf に渡したら、wsprintf はどこに書き込んだらいいのかわからなくてアクセス違反が発生してしまうのです。
あと、
> wsprintf( buff,"%d",&p);
wsprintf( buff,"%d",p);
ですよね、たぶん
皆さんの書き込みを元にいろいろ考え、ポインタを見直し、何とかできました。
ありがとうございました。
ツイート | ![]() |